1

首先,请原谅我对 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 * &)const”中引用(? CreateIPrepareDecoderUnit@CLSDEnc@@ABEJAAPAUIPrepareDecoderUnit@@@Z) lsdenc.obj

谁能指点我解决这个问题?

4

5 回答 5

5

当你写作时,CDecoderUnit();你正在做两件事:

  • 声明一个默认构造函数(不实现它,只是声明它)。
  • 导致编译器自行生成默认构造函数。

如果需要初始化任何东西,您需要定义构造函数,或者删除让编译器自己生成的声明。请注意,如果您确实实现了构造函数,如果您想从类外部创建对象,则必须将其公开。

于 2009-07-16T09:59:49.250 回答
1

可能出现的问题:

  • 您没有在 .cpp 中定义构造函数
  • 您没有在 .cpp 中包含正确的标题
  • 您忘记将构造函数设为公开(类方法默认为私有)

尝试:

  • 重建项目
  • 检查您是否在 .cpp 中包含正确的标题(拼写!;))
  • 请记住,您的构造函数应该是这样的:.cpp 中的 CDecoderUnit::CDecoderUnit(){}
  • 将 public: 添加到 .h 中类定义的顶部(请记住为您的 privates 做 private:)
  • 你忘了 ; 在类定义之后(不要以为是这样。编译器通常会为此生成不同的错误)

要使您的构造函数公开,请像这样声明该类:

class MyClass
{
public:
   //Public stuff goes here
   MyClass();
   void publicMethod();
private:
   //Private stuff goes here
};
于 2009-07-16T09:55:15.937 回答
1

您的项目中是否有包含方法体的源文件,例如 CDecoderUnit::CDecoderUnit()?

如果是这样,请检查该源文件上的属性以确保它确实被使用 - 在解决方案资源管理器中右键单击以选择属性并检查从构建中排除的常规属性设置为否。

行尾可能会出现一个更微妙的问题。编辑器了解不同的行尾样式,并将正确显示您的文件。编译器只理解 Windows (CR LF) 样式。如果第一行是 // 注释,那么编译器会将整个文件视为已被注释掉。在这种情况下,修复方法是将其保存为 Windows 样式 - 请参阅文件 - 高级保存选项。

于 2009-07-16T09:59:57.050 回答
0

这两个东西在两个不同的dll中吗?例如,如果您在一个 dll 中定义了 CDecoderUnit 并在另一个 dll 中创建了一个实例。如果是这种情况,那么您必须从第一个 dll 导出类,以便在另一个 dll 中创建对象。

于 2009-07-16T10:01:53.257 回答
-1

类中的默认可访问性是私有的。像这样声明你的构造函数:

public: CDecoderUnit();
于 2009-07-16T09:54:56.033 回答