1

まず最初に、C++ に関する知識が乏しいことをお許しください。私は本当の初心者です!

MS VS2005 で 1 つの C++ コードをコンパイルしようとしています。以下のコードについて、次のようなリンカ エラーが発生します。

1 つの関数 (一部のクラス メソッド) 定義には、次のようなメモリ割り当てのコードがあります。

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();あなたは2つのことをしています:

  • デフォルトのコンストラクターを宣言します(実装せず、宣言するだけです)。
  • コンパイラーがそれ自体でデフォルトのコンストラクターを生成しないようにします。

何かを初期化する必要がある場合はコンストラクターを定義するか、コンパイラーがそれ自体を生成できるようにする宣言を削除する必要があります。コンストラクターを実装する場合、クラスの外部からオブジェクトを作成する場合は、コンストラクターをパブリックにする必要があることに注意してください。

于 2009-07-16T09:59:49.250 に答える
1

プロジェクトに含まれているCDecoderUnit::CDecoderUnit()などのメソッドのメソッド本体を含むソースファイルはありますか?

その場合は、そのソースファイルのプロパティをチェックして、実際に使用されていることを確認します。ソリューションエクスプローラーで右クリックしてプロパティを選択し、[ビルドから除外される一般]プロパティが[いいえ]に設定されていることを確認します。

行末では、より微妙な問題が発生する可能性があります。エディターはさまざまな行末スタイルを理解し、ファイルを正しく表示します。コンパイラは、Windows(CR LF)スタイルのみを理解します。最初の行が//コメントの場合、コンパイラはファイル全体がコメントアウトされていると見なします。この場合の修正は、Windowsスタイルとして保存することです。「ファイル」-「高度な保存オプション」を参照してください。

于 2009-07-16T09:59:57.050 に答える
1

考えられる問題:

  • .cpp でコンストラクターを定義しませんでした
  • .cpp に正しいヘッダーが含まれていませんでした
  • コンストラクターを public にするのを忘れました (クラス メソッドはデフォルトで private です)

試してみてください:

  • プロジェクトを再構築する
  • .cpp に正しいヘッダーが含まれていることを確認してください (スペル! ;) )
  • コンストラクターは次のようにする必要があることに注意してください: .cpp の CDecoderUnit::CDecoderUnit(){}
  • public: を .h のクラス定義の先頭に追加します (private の場合は private: を忘れずに実行してください)。
  • ; を忘れました クラス定義の後 (これだとは思わないでください。コンパイラは通常、これに対して別のエラーを生成します)

コンストラクターを公開するには、次のようにクラスを宣言します。

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

これらの2つは2つの異なるdllにありますか?たとえば、あるdllでCDecoderUnitを定義し、別のdllでインスタンスを作成したとします。その場合は、最初のdllからクラスをエクスポートして、他のdllにオブジェクトを作成する必要があります。

于 2009-07-16T10:01:53.257 に答える
-1

クラスのデフォルトのアクセシビリティはプライベートです。次のようにコンストラクタを宣言します。

public: CDecoderUnit();
于 2009-07-16T09:54:56.033 に答える