在另一个类中使用时的C ++对象类问题

时间:2010-01-13 22:23:50

标签: c++ class object

在尝试使用另一个类(和2个内部类)创建类时遇到问题,我认为这可能是语法问题。

第一堂课

class listitem
{
//listitem.h(11)
public:
    //MONSTER CLASS
    static class monster
    {
    public:
        monster(string thename); 
        monster(void);
        ~monster(void);
    private:
        string name;
        int level;
    };
    //PLAYER CLASS
    static class player
    {
    public:
        player(string _pname, int _plevel, int _maxhp, int _currhp);
        player(void);
        ~player(void);
    private:
        string pname;
        int plevel;
        int maxhp;
        int currhp;
    };
public:
    listitem(player member, monster head);
    ~listitem(void);
private:
    player a;
    monster b;
    //other fields
};

第二节课是我遇到问题的地方:

class hatelist
{
private:
    vector<listitem> thelist;
public:
    hatelist(listitem newlist);
    int addNewListItem(listitem item);
    hatelist(void);
    ~hatelist(void);
};

违规代码的实施:

hatelist::hatelist(listitem inputlist)
{ //hatelist.cpp(6)
    thelist.push_back(inputlist);
}
1>hatelist.cpp
1>c:\...\listitem.h(11) : error C2011: 'listitem' : 'class' type redefinition
1>c:\...\listitem.h(11) : see declaration of 'listitem'
1>c:\...\hatelist.cpp(6) : error C2027: use of undefined type 'listitem'
1>c:\...\listitem.h(11) : see declaration of 'listitem'
1>c:\...\hatelist.cpp(6) : error C2227: left of '->{dtor}' must point to class/struct/union/generic type

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:4)

您是否使用

保护标题?
#ifndef LISTITEM_H
#define LISTITEM_H
 // All of your code

#endif

如果没有,可能会被包含两次,导致您的错误。

答案 1 :(得分:4)

C ++没有“静态类”的概念。结构:

static class A { ... } a;
允许

- 对象'a'是静态的。但用法如下:

static class A { ... };

应该是语法错误。

此外,但与您的问题无关,请说:

monster(void);

是unidiomatic C ++ - 通常首选的习惯用法是省略'void'(两者在语义上是相同的):

monster();

答案 2 :(得分:1)

您无法将static应用于类,删除它,我也看不到任何其他语法错误。确保在所有标题中使用include guard

答案 3 :(得分:1)

您粘贴的代码很难完成,因为它似乎不是整个文件。根据错误消息,听起来你忘了“保护”你的头文件:

#ifndef __MYHEADER_H_
#define __MYHEADER_H_

// header code goes here

#endif

当然要确保在.cpp文件中包含标题。

答案 4 :(得分:0)

我猜你在listitem.h中没有include guards并且你多次包含该文件。

包含防护允许您多次包含文件而不会出现问题。第一次包含该文件时,您将获得实际的定义/声明。之后,包含文件'变成空白'。