Проблемы с классом объектов C ++ при использовании в другом классе - PullRequest
2 голосов
/ 14 января 2010

Возникают проблемы при попытке создать класс с использованием другого класса (и 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 ]

4 голосов
/ 14 января 2010

C ++ не имеет понятия «статические классы». Конструкция:

static class A { ... } a;

разрешено - объект 'a' является статическим. Но использует, как:

static class A { ... };

действительно должно быть синтаксическими ошибками.

Кроме того, но это не имеет отношения к вашей проблеме, говоря что-то вроде:

monster(void);

является недиоматическим C ++ - обычно предпочитаемое выражение - пропустить 'void' (оба семантически идентичны):

monster();
4 голосов
/ 14 января 2010

Вы защитили свой заголовок с помощью

#ifndef LISTITEM_H
#define LISTITEM_H
 // All of your code

#endif

Если нет, то это может быть включено дважды, что приведет к вашей ошибке.

1 голос
/ 14 января 2010

Сложно понять весь код, который вы вставили, потому что он, кажется, не весь файл. Судя по сообщению об ошибке, вы забыли «защитить» свой заголовочный файл:

#ifndef __MYHEADER_H_
#define __MYHEADER_H_

// header code goes here

#endif

И, конечно, убедитесь, что вы включили заголовок в свой файл .cpp.

1 голос
/ 14 января 2010

Вы не можете применить static к классам, удалите это, и я не вижу других синтаксических ошибок. Убедитесь, что вы используете include guard во всех ваших заголовках.

0 голосов
/ 14 января 2010

Я предполагаю, что у вас нет включения охраны в listitem.h и вы включаете файл несколько раз.

Функция «Включить охрану» позволяет без проблем включать файл несколько раз. При первом включении файла вы получаете фактические определения / декларации. После этого включаемый файл «становится пустым».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...