单身的朋友声明导致链接器错误

时间:2014-12-21 03:30:16

标签: singleton linker-errors friend

构建程序时出现链接器错误。问题似乎是我的NetworkManager单例被带入友情声明的Networkable。我读到在.hpp文件中使用实例声明时可能会发生这种情况,但如果实例()函数没有以某种方式内联,那么这不应该是我的情况。

我在这里发现了类似的问题,但没有人能回答我的问题。有什么建议吗?

// Networkable.hpp
#pragma once
class Networkable
{
    friend class NetworkManager;

public:
    ....

//NetworkManager.hpp
#pragma once

class Networkable;

class NetworkManager
{
public:
    static NetworkManager &instance();
    ~NetworkManager();

    void registerNetworkable(Networkable *networkable);
    void unregisterNetworkable(Networkable *networkable);

    void update();
    ...

// errors:
1>NetworkManager.obj : error LNK2005: "public: __thiscall NetworkManager::~NetworkManager(void)" (??1NetworkManager@@QAE@XZ) already defined in Networkable.obj
1>NetworkManager.obj : error LNK2005: "public: static class NetworkManager & __cdecl NetworkManager::instance(void)" (?instance@NetworkManager@@SAAAV1@XZ) already defined in Networkable.obj
1>NetworkManager.obj : error LNK2005: "public: void __thiscall NetworkManager::registerNetworkable(class Networkable *)" (?registerNetworkable@NetworkManager@@QAEXPAVNetworkable@@@Z) already defined in Networkable.obj
1>NetworkManager.obj : error LNK2005: "public: void __thiscall NetworkManager::unregisterNetworkable(class Networkable *)" (?unregisterNetworkable@NetworkManager@@QAEXPAVNetworkable@@@Z) already defined in Networkable.obj
1>NetworkManager.obj : error LNK2005: "public: void __thiscall NetworkManager::update(void)" (?update@NetworkManager@@QAEXXZ) already defined in Networkable.obj

1 个答案:

答案 0 :(得分:0)

是的,我很惭愧地说我找到了答案。我在Networkable.cpp中包含了NetworkManager.cpp而不是.hpp。 猜猜这是在深夜编码时会发生什么......

但它确实有点提高了一个有效且容易犯错误 - 写.cpp而不是.hpp而不是"看到"问题。用.h来发现拼写错误要容易得多,让我质疑.hpp文件的命名标准...