首页 > 解决方案 > 指针和不完整的类类型

问题描述

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

字符.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;
    }
};

字符.h

class Character;

项目.h

class 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

标签: c++

解决方案


将类定义移动到 cpp 文件可以看到它们的标题中。现在所有的 cpp 文件都可以看到前向声明,这足以让他们知道类的存在,而不是他们里面有什么。

字符.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;
}

字符.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 中使用前向声明并将 item.h 完整包含在 character.cpp 中是有必要的。可能会稍微加快构建时间。这是一个中级问题,您应该稍后在更熟悉 C++ 语言时探讨;现在尽量保持简单。

项目.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。


推荐阅读