как использовать struct define в другом классе - PullRequest
1 голос
/ 27 ноября 2010

У меня есть класс, который выглядит как

struct Games
{ char Name[80];
char Rating;
bool  Played;
long NumberOfKills;
} Unreal, Blizzard[3];

typedef Games* Gamesptr;

int _tmain(int argc, _TCHAR* argv[])
{
    int x;
    Gamesptr  ptr =  new Games;
    return 0;
}

Теперь я хочу использовать структуру, определенную выше, в другом классе, как показано ниже

structTest::structTest(void)
{
}

structTest::~structTest(void)
{
}
void structTest::test(void)
{
    // goes here        
    Games *structptr = new Games;// This not working ....
}

как мне это сделать .. когда я попробовал, выдает ошибку "нет подходящего конструктора по умолчанию" ...

Ответы [ 2 ]

2 голосов
/ 27 ноября 2010

Похоже, ваш struct Games объявлен в одном файле, а structTest в другом файле.Это верно?

Ваш класс structTest должен видеть определение структуры Games, чтобы работать.

Поместить структуру Games в свой собственный файл (возможно, вызватьэто Games.h).#include это в файле, который включает в себя вашу функцию main, и в файле, который определяет класс structTest.

Обратите внимание, что Unreal и Blizzard[3] все еще должны находиться в файле, который включает в себяваша main функция, а не в заголовочном файле, которая должна содержать только определение struct (и, необязательно, typedef, если вы планируете использовать это в других модулях).

1 голос
/ 27 ноября 2010

Я думаю, вам следует улучшить форматирование, потому что даже в этот момент его уже трудно читать. Я едва ли когда-либо думаю о том, что может произойти на следующих этапах вашего проекта.

Теперь - прямо к вопросу.

Я думаю, вы хотите иметь следующее:

struct Games {
   // whatever
   bool value;
};

struct GamesHolder {
   Games games;
};

Теперь, если Games нетпросто держатель необработанных данных, но обозначает некоторую абстракцию или содержит слишком много данных для размещения в стеке, Вы можете использовать следующий шаблон:

struct GamesHolder {
   Games* games_pointer;
};

Инициализация теперь может быть реализована следующим образом:

GamesHolder games_holder;
games_holder.games_pointer = new Games(...whatever);

// If the memory is not cleared when the 'games_holder'
// leaves the scope - bang - a memory leak.

Поскольку иногда ручное управление памятью становится проблемой в * ss, вы также можете захотеть начать использовать общие указатели:

struct GamesHolder {
   std::shared_ptr<Games> games_pointer;
}

GamesHolder games_holder;
games_holder.games_pointer.reset(new Games(...));

// No leak if the 'holder' leaves the scope - memory
// is being automatically disposed.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...