调试 - 类/对象的东西,noob问题

时间:2012-01-05 23:00:24

标签: c++ object

请将这段代码拆开,让它变得复杂且几乎无法读取,我宁愿学习一次又一次,而不是多次以错误的方式学习同样的东西。

基类如下:

class baseMob{
private:
    int _healthMax;
    int _healthCurrent;
    int _manaMax;
    int _manaCurrent;
    int _experiencePoints;
public:
    //Set max Hp
    void setHealthMax(int);
    //Get max Hp
    int getHealthMax();
    //Set Current Hp
    void setCurrentHealth(int);
    //Get Current Health
    int getCurrentHealth();
    //Set Max Mana
    void setMaxMana(int);
    //Get Max Mana
    int getMaxMana();
    //Set Current Mana
    void setCurrentMana(int);
    //Get Current Mana 
    int getCurrentMana();
    //getMob Exp on kill
    int getExperiencePoints();
    //Set mob Exp points
    void setExperiencePoints(int);
//leaving out the member functions for space conservation

};

我正在尝试创建的个人暴徒是一个绿色的粘液,我正试图通过我制作的默认构造函数创建...

   class greenSlime: private baseMob{
    public:
        greenSlime(){
            setHealthMax(100);
            setMaxMana(100);
            setCurrentHealth(100);
            setCurrentMana(100);
            setExperiencePoints(150);
        }
    };

我的主要功能现在看起来像这样:

 greenSlime slime();
    for(; slime.getCurrentHealth() >= 0; slime.setCurrentHealth(-1)){
        cout << "The current health of the slime is: " << slime.getCurrentHealth() << endl;
        if (slime.getCurrentHealth() <= 0 ){
            cout << "Player is awarded with: " << slime.getExperiencePoints() << " Experience. ";
        }
    }

如果有人想撕掉它并让我看起来像个傻瓜,我真的很感激帮助。

我目前得到的错误是:

Project1.cpp:107:错误:请求成员getCurrentHealth' in slime',这是非类型的类型`greenSlime()()'

与其他相同类型的错误一起。

Tl; Dr:班级实施不起作用,发布了我的所有来源,当我可能已经发布了大约十分之一并且仍然有意义,并且很想有人告诉我为什么它不起作用以及如何我很糟糕。

5 个答案:

答案 0 :(得分:3)

问题是编译器认为粘液声明行是另一种类型的预解释,因为greenSlime没有带参数的ctor。

您可以通过不在粘液之后放置括号来修复它。

// greenSlime slime();
greenSlime slime;

对于您不理解的奇怪错误,我可以提供绝对最好的建议。提出一个较小的问题示例,可以更容易地发现实际上错误的内容。

这是我写的测试内容。

struct Foo {
    Foo() {}
    void bar() {}
};

int main(int argc, char ** argv) {
    Foo foo;
    foo.bar();
    return 0;
}

答案 1 :(得分:1)

class greenSlime: private baseMob{

应该是:

class greenSlime: public baseMob{

由于您继承的课程是私立,因此您无法看到任何继承的方法。

此外,Tom Kerr所说的,在声明对象后,你不想要括号。基本上,如果您不想要任何参数,请在制作对象时不要使用括号。

答案 2 :(得分:1)

另外,我想你会遇到的下一件事:你几乎不想要private inheritance,至少除非你知道你真的想要它。我猜你的意思是greenSlime的类声明 class greenSlime: public baseMob

答案 3 :(得分:1)

其他人已经指出了代码无效的问题。我会就程序设计提出建议。

在解释继承时,教程和编程类经常使用与您的代码非常相似的玩具示例。这些示例显示了继承是什么,但实际上并不是很擅长显示继承对哪些有用。

在这种情况下我不会使用继承。我认为更好的设计是拥有一个代表暴徒类型的类,并保存所有那种类型的暴徒的静态数据,例如暴徒名称,起始/最大HP,攻击类型等。然后有另一个类,其中每个实例代表一个特定的暴徒并保存为该暴徒改变的数据,例如当前的hp。

class Mob_type {
    string name;
    int max_hp;
    vector<shared_ptr<Attack_type>> attacks;
public:
    Mob_type(string name,int max_hp,vector<shared_ptr<Attack_type>> attacks)
    : name(name),max_hp(max_hp),attacks(attacks) {}
    int get_max_hp() const { return max_hp; }
};

class Mob {
    Mob_type const &type;
    int hp;
public:
    Mob(Mob_type const &type) : type(type), hp(type.get_max_hp()) {}
    Mob_type const &get_type() const { return type; }
    int get_hp() const { return hp; }
};

void print_health(Mob const &m) {
    cout << m.get_hp() << '/' << m.get_type().get_max_hp() << '\n';
}

int main() {
    vector<shared_ptr<Attack_type>> attacks; // ...
    Mob_type green_slime("Green Slime",50,attacks);

    Mob green_slime_A(green_slime), green_slime_B(green_slime);

    fight(green_slime_A,green_slime_B);

    cout << "A: ";
    print_health(green_slime_A);
    cout << "B: ";
    print_health(green_slime_B);

}

通过这种方式,您可以拥有一个包含mob类型的数据文件,而添加类型所需要做的就是更新数据文件。

答案 4 :(得分:0)

首先,如果你进行私有继承,你将无法访问任何基类的函数。公共继承允许您访问基类的公共和受保护函数和成员。

其次,如果你想制作一个greenSlime类的指针,你必须这样做:

//greenSlime() with parentheses
greenSlime *slime = new greenSlime();

但是如果你想用非参数构造函数(默认构造函数)创建greenSlime的对象,你必须这样做:

//without parentheses
greenSlime slime;