2015-02-12 4 views
1

Я новичок в C++ и имеющий следующий вопрос:класс Child не является статическим членом родительского

У меня есть родительский класс, называемый Существо:

class Creature 
{ 
public: 
    bool isActive; 
    std::string name; 
    int attackNumOfDice, attackNumOfSides, 
       defenseNumOfDice, defenseNumOfSides; 
    int armor, strength; 

    Creature(); 
    //two virtual functions determine the damage points 
    virtual int attack(); 
    virtual int defend(); 
    void halveAttackDice(); 
    void setStrength(int toSet); 
    void setStatus(bool activity); 

}; 

и 5 дочерних классов, как так:

.h файл: файл

class Child : public Creature 
{ 
int attack(); 
int defend(); 
} 

реализация:

int Child::isActive = true; 
    std::string Child::name = ""; 
    int Child::attackNumOfDice = 2; 
    ... 

    int Child::attack() 
{ 
... 
} 
    intChild::defend() 
{ 
...} 

Однако, когда я пытаюсь скомпилировать, как это я получаю ту же ошибку для всех 5 дочерних классов:

child.cpp:6: error: ‘bool Child::isActive’ is not a static member of ‘class Child’ 
child.cpp:7: error: ‘std::string Child::name’ is not a static member of ‘class Child’ 
child.cpp:8: error: ‘int Child::attackNumOfDice’ is not a static member of ‘class Child’ 
... 

Я не понимаю, почему говорят не статический член, когда я никогда не определил один ?

ответ

1

Вы пытаетесь получить доступ к классам без контекста объектов. Ошибка основана на том, что вы пытаетесь инициализировать атрибуты класса, поскольку они были статическими.

Это неправильно:

int Child::isActive = true; 
std::string Child::name = ""; 
int Child::attackNumOfDice = 2; 

Это неправильно, потому что, когда мы говорим о не-статических атрибутов, они должны быть связаны с объектом. Как вы указываете значения по умолчанию для атрибутов, вы не связываете их с каким-либо объектом.

Если вы хотите, чтобы значения по умолчанию для атрибутов класса, сделать это в конструкторе, более конкретно, используя список инициализации (обратите внимание на here)

Child::Child() : Creature(){ 
    ... 
} 

... 

Creature::Creature() : isActive(false), name(""){ 
    ... 
} 

Когда конструктор вызывается (или любой не статический метод класса), ему передается ссылка на неявный объект (также известный как указатель). Таким образом, доступ к атрибутам всегда происходит с использованием этого контекста объекта.

+0

спасибо ... есть способ сделать это, используя только конструктор в классе родителя? в подсказке указывается, что должен быть только один конструктор –

+0

да ... вы можете вызвать родительский конструктор из конструктора класса подкласса, используя этот sintax: Child :: Child(): Creature() {}. Вам просто нужно оставить свой конструктор подкласса пустым, и он запустит код, который существует в родительском конструкторе. –

+1

Если вы пытаетесь инициализировать переменные в конструкторе, используйте список инициализаторов конструктора, вместо инструкций присваивания в теле конструктора. –