0

次のファイルがあります:
interface.h

class Interface
{
  ...
};

Interface* CreateInterface();

impl.h

#include "interface.h"

class Impl: public Interface
{
  ...
};

impl.cpp

#include "impl.h"

SomeInterface* CreateInterface()
{
  return new Impl;
}
...

main.cpp

#include "Interface.h"
int main()
{
  CreateInterface();
}

もともと私のプロジェクトはこれが好きでした。ただし、テスト目的のために、すべてのファイルは現在同じプロジェクトにあります。
コンパイルすると、CreateInterface が解決されていないという LNK2019 エラーが発生します。私はVS 2008を使用していますが、何が問題なのかわかりません。

4

2 に答える 2

2

CreateInterface()複数の宣言をするつもりですか?

Interface.h

Interface* CreateInterface();

Impl.cpp

SomeInterface* CreateInterface()

これらのうちの1つ(後者)のみが実際に実装されているように見えます。名前があいまいで、コンパイラが間違った名前を選択しているようです(おそらく、他の名前が存在する手がかりがないためです)。

Interface.hのプロトタイプと同じパラメーターリストとリターンタイプを使用CreateInterface()して、impl.cppで定義します。私は通常、そのような獣のようなデザインを容認しませんが、それはあなたが望むもののようです。

Impl.cpp

Interface* CreateInterface() // note the return type
{
    return new Impl;
}

正直なところ、これがコンパイルされることすら信じられません。これは、2つの違い(Interface.hでの宣言とImpl.cppでの実装)が戻り型の違いであり、コンパイラーがそのすべてを吐く必要があることを考えるとです。まだ表示されていないものがある可能性があります。

于 2012-11-26T08:20:39.907 に答える
0

リンカは、 が存在し、関数であることを知っていることを伝えてCreateInterfaceいますが、実際の関数自体を見つけることができません。したがって、プロジェクトに impl.cpp が含まれておらず、コンパイルされていないと思われます。

于 2012-11-26T07:48:44.467 に答える