Class 包含自己的列表
Class that contains a list of itself
这就是我想要做的(在我的头文件中):
#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;
};
如果一切正常,这将创建一个 class,它可以包含一个整数或一个列表,并且它会尽可能的类型安全,因为我会调用 which_type在每次调用 get 函数之一之前执行函数,如果对象类型不正确,get 函数将抛出异常。
但是,这是不可能的,因为 Data
需要 union data
,而 union data
需要 forward_list<Data*>
。我相信 boost 有我正在寻找的东西,但是有没有办法在没有 boost 的情况下做到这一点?我宁愿使用标准库来了解有关 c++ 标准库的更多信息。
您只需要前向声明 class Data
,然后在 class Data
正确声明之前声明 union 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++ 编译没有问题。
Class 成员可能不是不完整的 class 类型(尽管它们可能是对此类类型的指针或引用)。所以需要先定义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
class 来完成,因为它只使用一个指向它的指针。
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;
};
这就是我想要做的(在我的头文件中):
#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;
};
如果一切正常,这将创建一个 class,它可以包含一个整数或一个列表,并且它会尽可能的类型安全,因为我会调用 which_type在每次调用 get 函数之一之前执行函数,如果对象类型不正确,get 函数将抛出异常。
但是,这是不可能的,因为 Data
需要 union data
,而 union data
需要 forward_list<Data*>
。我相信 boost 有我正在寻找的东西,但是有没有办法在没有 boost 的情况下做到这一点?我宁愿使用标准库来了解有关 c++ 标准库的更多信息。
您只需要前向声明 class Data
,然后在 class Data
正确声明之前声明 union 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++ 编译没有问题。
Class 成员可能不是不完整的 class 类型(尽管它们可能是对此类类型的指针或引用)。所以需要先定义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
class 来完成,因为它只使用一个指向它的指针。
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;
};