0

編集: 以下のコメントで DyP が指摘したように、これは c3(SoccerWorld) の関数定義の単なるタイプミスでした。

  • c1たとえば、仮想関数を持つクラスがありfます。
  • 別のクラスはc2から継承しc1、別のクラスは からc3継承しc2ます。
  • c2には仮想機能がありませんが、いくつかの変更fを加えて追加したいと考えてc3います。
  • の仮想関数は純粋fc1はなく、 で定義されていc1.cppます。私もまだにいる必要がありfますc1

ではなくに追加fすると、未解決の外部シンボル エラーが発生します。に仮想関数としても追加すると、2 つのエラーが発生します。c3c2fc2c1.objfc3

c1c2c3は次のようになります。

class C1 {
   virtual void f() { ... }
};

class C2 : public C1 {
   //No virtual f
};

class C3 : public C2 {
   virtual void f() { /*Do something*/ }
};

実数関数:

AbstractKart *World::createKart(const std::string &kart_ident, int index, int local_player_id, int global_player_id, RaceManager::KartType kart_type)
{ ... }

これはクラス World にあります。クラス WorldWithRank は World を継承しており、createKart 関数はありません。クラス SoccerWorld は WorldWithRank から継承します。これに createKart を持たせて、SoccerWorld の場合は別の方法でカートを配置します。

createKart は World で保護されています。

エラー:

world.obj : error LNK2005: "protected: virtual class AbstractKart * __thiscall World::createKart(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int,int,int,enum RaceManager::KartType)" (?createKart@World@@MAEPAVAbstractKart@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HHHW4KartType@RaceManager@@@Z) already defined in soccer_world.obj

soccer_world.obj : error LNK2001: unresolved external symbol "protected: virtual class AbstractKart * __thiscall SoccerWorld::createKart(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int,int,int,enum RaceManager::KartType)" (?createKart@SoccerWorld@@MAEPAVAbstractKart@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HHHW4KartType@RaceManager@@@Z)
4

2 に答える 2

3

OPへのコメントから再投稿:

あなたのエラーから推測すると、むしろタイプミスがあると思います。のように見えますが、 の代わりにsoccer_world.cpp関数を定義しました。AbstractKart *World::createKart(...)AbstractKart *SoccerWorld::createKart(...)

AbstractKart *World::createKart(...)これにより、最初のエラーを説明するの 2 番目の定義が作成されます。

world.obj : エラー LNK2005: " protected: virtual class AbstractKart * __thiscall World::createKart([...])" [...] Soccer_world.obj で既に定義されています

not-defined を呼び出そうとすると、2 番目のエラーが発生しますAbstractKart *SoccerWorld::createKart(...)

Soccer_world.obj : エラー LNK2001: 未解決の外部シンボル " protected: virtual class AbstractKart * __thiscall SoccerWorld::createKart([...])" [...]

于 2013-07-21T19:10:00.667 に答える
1

クラス C2 で常に f() を次のように定義できます。

class C2 : public C1 {

     virtual void f() { C1::f(); }

};

これにより、C3 が存在しなかったかのように C2 が機能できるようになります。

于 2013-07-21T18:23:50.183 に答える