Невозможно установить частные статические переменные-члены с помощью средства доступа

Zombie.h имеет несколько статических переменных-членов. Read.cpp, который включает в себя Zombie.h, знает значения, которые должны быть в этих переменных. Я хочу, чтобы read.cpp устанавливал эти переменные с чем-то вроде строк

int Zombie::myStaticInt = 4;

or

Zombie::setStaticVar(4);

Я перепробовал все, что мог придумать, в том числе использовал общедоступную статическую функцию доступа и даже сделал общедоступными сами статические переменные, но я получаю много ошибок «неопределенная ссылка» или «недопустимое использование квалифицированного имени». Изучив их, я узнал, как установить частные статические переменные-члены Zombie.h из Zombie.cpp, но у меня нет файла Zombie.cpp, просто read.cpp. Могу ли я вместо этого установить их из Read.cpp, и если да, то как?

// In Zombie.h
class Zombie {
public:
    static void setMax(int a_in, int b_in, int c_in) {
        a = a_in;
        b = b_in;
        c = c_in;
    }
private:
    static int a, b, c;
}

// In read.cpp
#include "Zombie.h"
...
main() {
    int Zombie::a; // SOLUTION: Put this outside the scope of main and other functions
    int Zombie::b; // SOLUTION: Put this outside the scope of main and other functions
    int Zombie::c; // SOLUTION: Put this outside the scope of main and other functions
    int first = rand() * 10 // Just an example
    int second = rand() * 10 // Just an example
    int third = rand() * 10 // Just an example
    Zombie::setMax(first, second, third);
    return 0;
}

Это дает (обновлено) (переместите первые три строки main за пределы main(), чтобы решить эту проблему)

invalid use of qualified-name 'Zombie::a'
invalid use of qualified-name 'Zombie::b'
invalid use of qualified-name 'Zombie::c'

person Qaz    schedule 05.03.2014    source источник
comment
Не имеет значения, в какой файл .cpp попадают строки, если только не задействовано пространство имен. Можете ли вы опубликовать минимальный код, который показывает проблему?   -  person Mark Ransom    schedule 05.03.2014
comment
Пожалуйста, опубликуйте свой код; мы не можем помочь много без него.   -  person cf stands with Monica    schedule 05.03.2014
comment
@MarkRansom Я предполагаю, что оператор пытается установить частные переменные вне класса, основываясь на я узнал, как установить частные статические переменные-члены Zombie.h из Zombie.cpp , но, как вы сказали, мы нужен код.   -  person cf stands with Monica    schedule 05.03.2014
comment
@computerfreaker, неважно, публичные они или частные, вот в чем дело. Компилятору все равно, как называется файл .cpp и связано ли оно с именем класса или нет.   -  person Mark Ransom    schedule 05.03.2014
comment
@MarkRansom Верно, но если бы оператор пытался установить переменную частного класса извне класса, это привело бы к ошибке. Хотя, похоже, дело не в этом.   -  person cf stands with Monica    schedule 05.03.2014


Ответы (3)


Вы должны где-то определить a,b,c. До сих пор вы только декларировали их существование. В каком-то файле .cpp во внешней области вам нужно добавить:

int Zombie::a;
int Zombie::b;
int Zombie::c;

РЕДАКТИРОВАТЬ Повторите свои изменения, вы не можете поместить их в метод. Вы должны поместить это в самую внешнюю область файла .cpp.

person user207421    schedule 05.03.2014

В отличие от нестатических переменных, память которых выделяется в каждом объекте, статические переменные должны храниться вне класса. Вы делаете это, создавая определения для переменных в файле .cpp. Неважно, в каком файле они идут, хотя для удобства они должны идти вместе с кодом класса.

int Zombie::a;
int Zombie::b;
int Zombie::c;

Ошибка компоновщика, которую вы получаете, говорит вам, что эти строки отсутствуют.

person Mark Ransom    schedule 05.03.2014
comment
Спасибо за объяснение. После их добавления я снова получаю недопустимое использование квалифицированного имени «a» (или b или c). - person Qaz; 05.03.2014
comment
@Qaz, у меня работает: ideone.com/OVh8dp. Вам нужно добавить больше кода, чтобы продемонстрировать, как вы получаете ошибку. - person Mark Ransom; 05.03.2014

Ваша проблема в том, что вы еще не реализовали класс Zombie. Ваш код здесь:

зомби.ч

#ifndef ZBE_H
#define ZBE_H

class Zombie
{
public:
    static int myStaticInt;

    Zombie();
};
#endif

read.cpp

#include <stdio.h>
#include <iostream>
#include "zombie.h"

int Zombie::myStaticInt = 1;

Zombie::Zombie()
{
}

int main()
{ 
    cout << "OOOK: " << Zombie::myStaticInt << endl;

    Zombie::myStaticInt = 100;

    cout << "OOOK: " << Zombie::myStaticInt << endl;

    return 0;
}
person Ronaldinho    schedule 05.03.2014
comment
В моем примере я использовал числа 3, 4 и 5, но в моем реальном коде я должен использовать переменные. Если я использую этот код, мне потребуются глобальные переменные, чтобы сделать это, если я правильно его интерпретирую. Какую функцию выполняет ok()? - person Qaz; 05.03.2014
comment
Я не думаю, что myStaticInt является глобальным, как вы можете видеть по оператору разрешения области видимости ::. - person Leonardo; 05.03.2014
comment
Переменные в read.cpp, значения которых я копирую в Zombie, находятся внутри области видимости main(). Мне пришлось бы поднять их до глобальных переменных, чтобы использовать их вне main в int Zombie::myStaticInt = myVar. Однако я не уверен, почему это не работает внутри main(). - person Qaz; 05.03.2014
comment
Я обновляю функцию main(), которая использует Zombie::myStaticInt внутри основной функции. - person Ronaldinho; 05.03.2014