引用方法的未定义引用

时间:2014-05-14 16:05:53

标签: c++

我得到一个未定义的引用,我不知道为什么,所有内容都看起来正确地声明和定义并链接,但显然有一些错误。

错误:

我在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进行了未定义的引用?

1 个答案:

答案 0 :(得分:1)

您有一个循环#include方案。

注意......

order.h

#include "user-order.h"

user-order.h

#include "order.h"

因此编译器在编译过程中无法知道所有类型的定义。

您必须重新设计类图。由于除了部分方法原型之外您还没有发布任何其他代码,我只能建议您将Order类转换为多态基类并从中派生UserOrder

当然,您的程序可能需要额外的重复因子操作。

编辑 - 您可以在以下Resolve circular dependencies in c++ Stack Overflow帖子中找到有关如何解决循环依赖关系的有用信息