指针和不完整的类类型

时间:2019-06-14 20:53:36

标签: c++

我有一些cpp文件和它们的头。问题是当我尝试做这样的事情时:

character.cpp

#include "item.h"
class Character {
public:
// variables such as health etc //
    void equip(Item *i){
        equipment.push_back(i);
        this->attc += i->attc;
        this->health += i->health;
        this->luck += i->luck;
        this->mana += i->mana;
        i->equipped = true;
    }
};

character.h

class Character;

item.h

class Item;

item.cpp

#include "item.h"
class Item {
public:
    bool equipped;
    string desc;
    int attc;
    int health;
    int mana;
    bool twoHanded;
    int luck;
};

预期可以工作,但可以得到:

  

不允许指向不完整的类类型的指针

…在i->something行中。

我真的不知道为什么它不起作用:c

1 个答案:

答案 0 :(得分:2)

将类定义移动到cpp文件可以查看它们的标题中。现在,所有cpp文件都可以看到forward declaration,这足以让他们知道该类存在,而不是它们中的内容。

character.cpp

#include "character.h" // changed from item.h
// body of equip function moved here.
void Character::equip(Item *i){
     ^^^^^^^^^^^ note scope resolution
    equipment.push_back(i);
    this->attc += i->attc;
    this->health += i->health;
    this->luck += i->luck;
    this->mana += i->mana;
    i->equipped = true;
}

character.h

#include "item.h" // added. Easiest way to get knowledge of Item into character.h 
                  // and character.cpp

class Character {
public:
// variables such as health etc //
    void equip(Item *i);
};

有时需要在character.h中使用前向声明,并在character.cpp中完整包含item.h。可能会稍微加快构建时间。这是一个中级问题,您应该在以后更熟悉C ++语言时再进行探讨。现在尝试使事情保持简单。

item.h

#include "item.h"
class Item {
public:
    bool equipped;
    string desc;
    int attc;
    int health;
    int mana;
    bool twoHanded;
    int luck;
};

将所有内容从Item.cpp移动到Item.h。当前不需要Item.cpp。