如何解决头文件中的循环引用
How to Resolve Circular Reference in Header File
我有以下头文件(为便于说明此处进行了简化):
#include <vector>
class Box;
class Item {
int row;
int column;
Box *box;
public:
Item(Box *b) : box(b) {}
void thiswontcompile() { box->dosomething(); }
void foo();
};
class Box {
std::vector<Item*> items;
public:
Box() {}
void addsquare(Item *sq) { items.push_back(sq); }
void bar() { for (int i=0; i<items.size(); i++) items[i]->foo(); }
void dosomething();
};
编译器反对带有 thiswontcompile() 的行,抱怨不完整类型的无效使用 'class Box'。我知道我可以通过将此定义移动到实现文件来更正错误,但是有什么方法可以将所有这些编码保留在头文件中吗?
你可以把thiswontcompile
的定义移到头文件的末尾,你只需要让函数inline
.
#include <vector>
class Box;
class Item {
int row;
int column;
Box *box;
public:
Item(Box *b) : box(b) {}
void thiswontcompile();
void foo();
};
class Box {
std::vector<Item*> items;
public:
Box() {}
void addsquare(Item *sq) { items.push_back(sq); }
void bar() { for (int i=0; i<items.size(); i++) items[i]->foo(); }
void dosomething();
};
inline void Item::thiswontcompile() { box->dosomething(); }
我有以下头文件(为便于说明此处进行了简化):
#include <vector>
class Box;
class Item {
int row;
int column;
Box *box;
public:
Item(Box *b) : box(b) {}
void thiswontcompile() { box->dosomething(); }
void foo();
};
class Box {
std::vector<Item*> items;
public:
Box() {}
void addsquare(Item *sq) { items.push_back(sq); }
void bar() { for (int i=0; i<items.size(); i++) items[i]->foo(); }
void dosomething();
};
编译器反对带有 thiswontcompile() 的行,抱怨不完整类型的无效使用 'class Box'。我知道我可以通过将此定义移动到实现文件来更正错误,但是有什么方法可以将所有这些编码保留在头文件中吗?
你可以把thiswontcompile
的定义移到头文件的末尾,你只需要让函数inline
.
#include <vector>
class Box;
class Item {
int row;
int column;
Box *box;
public:
Item(Box *b) : box(b) {}
void thiswontcompile();
void foo();
};
class Box {
std::vector<Item*> items;
public:
Box() {}
void addsquare(Item *sq) { items.push_back(sq); }
void bar() { for (int i=0; i<items.size(); i++) items[i]->foo(); }
void dosomething();
};
inline void Item::thiswontcompile() { box->dosomething(); }