Не могат да се задават частни статични членски променливи с инструмент за достъп

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 Предполагам, че op се опитва да зададе частни променливи извън класа, въз основа на Намерих как да задам частни статични членски променливи на 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 Добре, но ако op се опитваше да зададе променлива на частен клас извън класа, щеше да излезе грешка. Изглежда, че проблемът не е в това.   -  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