2015-08-14 3 views
0

Это то, что я пытаюсь сделать (в моем файле заголовка):Класс, который содержит список себе

#include <forward_list> 

class Data { 
public: 
     Data(int type, union data value); 
     int which_type(); 
     void set_int(const int& i); 
     void set_list(std::forward_list<Data*>& l); 
     int get_int(); 
     std::forward_list<Data*>* get_list(); 
private: 
     union data actual_data; 
     int type; 
}; 

union data { 
     int i; 
     std::forward_list<Data*> l; 
}; 

Если бы все было работать должным образом, это может создать класс, который может содержать целое число или список, и он будет как можно более безопасным по типу, потому что я бы назвал функцию who_type перед каждым вызовом одной из функций get, а функции get будут генерировать исключение, если объект не является правильным типом.

Однако это невозможно, потому что Data нуждается в union data, а union data нуждается в forward_list<Data*>. Я считаю, что у boost есть то, что я ищу, но есть ли способ сделать это без повышения? Я бы просто использовал стандартную библиотеку, чтобы больше узнать о стандартной библиотеке C++.

+0

Почему бы не переслать декларацию 'Data' и переместить' union_data' перед определением 'Data'? – Caninonos

ответ

2

Все, что вам нужно, это переслать объявление class Data, а затем объявить union data перед объявлением class Data.

#include <forward_list> 


class Data; 
union data { 
     int i; 
     std::forward_list<Data*> l; 
}; 


class Data { 
public: 
     Data(int type, union data value); 
     int which_type(); 
     void set_int(const int& i); 
     void set_list(std::forward_list<Data*>& l); 
     int get_int(); 
     std::forward_list<Data*>* get_list(); 
private: 
     union data actual_data; 
     int type; 
}; 

Компиляция с g ++ и clang ++ без проблем.

+0

Это именно то, что я искал. Я не знал, что C++ может это сделать. Благодарю. –

2

Члены класса могут не быть неполными типами классов (хотя они могут быть указателями или ссылками на такие типы). Поэтому вам нужно определить union data, прежде чем вы сможете объявить его членом в Data. Это просто:

class Data { 
public: 
     Data(int type, union data value); 
     int which_type(); 
     void set_int(const int& i); 
     void set_list(std::forward_list<Data*>& l); 
     int get_int(); 
     std::forward_list<Data*>* get_list(); 
private: 
     union data { 
      int i; 
      std::forward_list<Data*> l; 
     } actual_data; 
     int type; 
}; 

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

union data { 
    int i; 
    std::forward_list<class Data*> l; 
}; 

class Data { 
public: 
     Data(int type, union data value); 
     int which_type(); 
     void set_int(const int& i); 
     void set_list(std::forward_list<Data*>& l); 
     int get_int(); 
     std::forward_list<Data*>* get_list(); 
private: 
     data actual_data; 
     int type; 
}; 
+0

Это не работает, я попробовал. Ему нужны данные, даже если это всего лишь указатель. –

+0

@Programman какой? Они оба работают на меня. – Brian

+0

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

Смежные вопросы