提问人:LeopardSkinPillBoxHat 提问时间:5/21/2010 更新时间:5/21/2010 访问量:2587
继承接口时未解析的符号
Unresolved symbol when inheriting interface
问:
现在是深夜,我快要疯了,试图解决链接器错误。
如果我有以下抽象接口:
class IArpPacketBuilder
{
public:
IArpPacketBuilder(const DslPortId& aPortId);
virtual ~IArpPacketBuilder();
// Other abstract (pure virtual methods) here...
};
我是这样实例化的:
class DummyArpPacketBuilder
: public IArpPacketBuilder
{
public:
DummyArpPacketBuilder(const DslPortId& aPortId)
: IArpPacketBuilder(aPortId) {}
~DummyArpPacketBuilder() {}
};
为什么我在链接时收到以下错误?
Unresolved symbol references:
IArpPacketBuilder::IArpPacketBuilder(DslPortId const&):
ppc603_vxworks/_arpPacketQueue.o
IArpPacketBuilder::~IArpPacketBuilder():
ppc603_vxworks/_arpPacketQueue.o
typeinfo for IArpPacketBuilder:
ppc603_vxworks/_arpPacketQueue.o
*** Error code 1
IArpPacketBuilder
是一个抽象接口,所以只要我在具体(派生的)接口中定义构造函数和销毁,我应该没问题,不是吗?好吧,似乎不是。
答:
1赞
XAder
5/21/2010
#1
尝试内联它们 - 对我有用,尽管不知道这是否是好的解决方案
评论
0赞
LeopardSkinPillBoxHat
5/21/2010
您的意思是在IArpPacketBuilder中提供内联实现?
5赞
Péter Török
5/21/2010
#2
您只声明了 的构造函数和析构函数,而没有定义它们。链接器也需要定义。请注意,C++没有抽象接口的概念 - 是一个普通的旧类,它恰好包含一些纯虚方法,因此无法直接实例化。IArpPacketBuilder
IArpPacketBuilder
因此,最简单的解决方案是提供内联实现:
class IArpPacketBuilder
{
public:
IArpPacketBuilder(const DslPortId& aPortId) {}
virtual ~IArpPacketBuilder() {}
// Other abstract (pure virtual methods) here...
};
您也可以使析构函数成为纯虚拟的,但即便如此,您仍然需要为它提供定义,例如
class IArpPacketBuilder
{
public:
IArpPacketBuilder(const DslPortId& aPortId) {}
virtual ~IArpPacketBuilder() = 0;
// Other abstract (pure virtual methods) here...
};
IArpPacketBuilder::~IArpPacketBuilder() {}
评论
0赞
LeopardSkinPillBoxHat
5/21/2010
我已经能够在另一个库中继承这个接口而没有任何问题,所以我认为这不会成为问题。我需要在抽象接口中定义它们吗?
0赞
Péter Török
5/21/2010
@Leopard,有趣。我认为它不会以这种方式工作 - 如果你显式声明一个构造函数/析构函数,编译器不会自动为你生成它。请注意,C++ 没有抽象接口的概念 - 您的类是一个带有一些纯虚方法的普通类,这使得它的直接实例化是不可能的。
0赞
LeopardSkinPillBoxHat
5/21/2010
谢谢,我通过定义 ctor 和 dtor 的主体来让它工作,但我仍然不明白为什么当我没有定义 ctor 和 dtor 时它在另一个库中工作。
0赞
LeopardSkinPillBoxHat
5/21/2010
我刚刚想通了。我有一个用于接口的 .cpp 文件,该文件确实定义了 ctor 和 dtor,但是当我从另一个库中的接口继承时,我没有链接到该 .cpp 文件,这就是我得到未解析符号的原因。愚蠢的错误!
0赞
Péter Török
5/21/2010
@Leopard,那就少了一个谜团......事物的秩序被恢复了:-)
2赞
anon
5/21/2010
#3
您需要提供定义 - 即抽象接口类的构造函数和析构函数的代码体 - 这两个函数都将在您的代码中使用,即使该类是抽象的。抽象类不是从不实例化的类,而是用户从不直接实例化的类。但是,它将由编译器实例化,编译器需要定义构造函数和析构函数。
评论