我得到一个未定义的引用,我不知道为什么,所有内容都看起来正确地声明和定义并链接,但显然有一些错误。
错误:
我在undefined reference
UserOrder::add(User&, Order&)
到Order::Order(UserOrder& [...])
order.h
:
#include "user-order.h"
class Order {
public:
Order(UserOrder& [...], User&, [...]);
[...]
};
order.cpp
Order::Order(UserOrder& u_o [...], User& u, [...]) {
[...]
u_o.add(u, *this); // here is the undefined reference
[...]
}
user-order.h
:
#include "user.h"
#include "order.h"
class Order;
class UserOrder {
public:
[...]
typedef std::set<Order*> Orders;
void add(User&, Order&);
[...]
private:
std::map<User*, Orders> orders;
std::map<Order*, User*> users;
};
user.cpp
UserOrder::add(User& u, Order& o) {
orders[&u].insert(&o);
users.insert(make_pair(&o, &u));
}
为什么我对add
进行了未定义的引用?
答案 0 :(得分:1)
您有一个循环#include
方案。
注意......
order.h
#include "user-order.h"
和
user-order.h
#include "order.h"
因此编译器在编译过程中无法知道所有类型的定义。
您必须重新设计类图。由于除了部分方法原型之外您还没有发布任何其他代码,我只能建议您将Order
类转换为多态基类并从中派生UserOrder
。
当然,您的程序可能需要额外的重复因子操作。
编辑 - 您可以在以下Resolve circular dependencies in c++ Stack Overflow帖子中找到有关如何解决循环依赖关系的有用信息