首先,请原谅我对C ++的了解不足。我是一个真正的初学者!
我正在尝试在MS VS2005上编译一个C ++代码。我在下面的代码中收到如下链接器错误: -
在一个函数(某种类方法)定义中,它具有内存分配代码,如:
CDecoderUnit *du = new CDecoderUnit(); //<<error is shown at this line
此CDecoderUnit是在头文件中定义的类,如
class CDecoderUnit : public IPrepareDecoderUnit
{
CDecoderUnit();
~CDecoderUnit();
...
...
other class definition.
..
..
}
实际错误是: -
错误LNK2019:未解析的外部符号“public:__thiscall CDecoderUnit :: CDecoderUnit(void)”(?? 0CDecoderUnit @@ QAE @ XZ)在函数“private:long __thiscall CLSDEnc :: CreateIPrepareDecoderUnit(struct IPrepareDecoderUnit *&amp;)”中引用const“(?CreateIPrepareDecoderUnit @ CLSDEnc @@ ABEJAAPAUIPrepareDecoderUnit @@@ Z)lsdenc.obj
有人能指点我解决这个问题吗?
答案 0 :(得分:5)
当你写CDecoderUnit();
时,你正在做两件事:
如果需要初始化任何东西,你需要定义构造函数,或者删除允许编译器自己生成一个的声明。请注意,如果您确实实现了构造函数,那么如果要从类外部创建对象,则必须将其公之于众。
答案 1 :(得分:1)
可能出现的问题:
尝试:
要使构造函数公开,请按以下方式声明类:
class MyClass
{
public:
//Public stuff goes here
MyClass();
void publicMethod();
private:
//Private stuff goes here
};
答案 2 :(得分:1)
您是否拥有包含项目中包含的CDecoderUnit :: CDecoderUnit()等方法的方法主体的源文件?
如果是这样,请检查该源文件上的属性以确保它实际上正在使用 - 右键单击解决方案资源管理器以选择属性并选中常规属性从生成中排除已设置没有。
线路结尾可能会出现更微妙的问题。编辑器了解不同的行结束样式,并将正确显示您的文件。编译器只能理解Windows(CR LF)样式。如果第一行是//注释,则编译器将整个文件视为已注释掉。在这种情况下,修复方法是将其另存为Windows样式 - 请参阅文件 - 高级保存选项。
答案 3 :(得分:0)
这两件事在两个不同的dll中吗?例如,如果您在一个dll中定义了CDecoderUnit并在另一个dll中创建了一个实例。如果是这种情况,则必须从第一个dll导出类,以便在另一个中创建对象。
答案 4 :(得分:-1)
类中的默认辅助功能是私有的。像这样声明你的构造函数:
public: CDecoderUnit();