2013-03-07 36 views
7

私のインターフェイスのクラスなどの概要!C++:エラーLNK:仮想関数の結果である未解決の外部シンボル

Animal.H:

class Animal 
{ 
public: 
    virtual void walk(); 
} 

Animals.CPP

= EMPTY

Cow.H:

class Cow : public Animal 
{ 
public: 
    virtual void walk(); 
} 

これは、右から派生したクラスから歩行を取っていることを外的に知るべきですか? (e.a.Animal ..)私は関数の歩行を定義wouldnt、それは私はそれを右に定義する必要があります言う必要があります...?

Cow.CPP:

void Cow::walk() 
{ 
    //do something specific for cow 
} 

SomeOtherClass.H

namespace SomeNamespace 
{ 
    void LetAnimalWalk(); 
} 

SomeOtherClass.CPP

Cow myCow; 
namespace SomeNamespace 
{ 
    void LetAnimalWalk() 
    { 
     myCow.walk(); 
    } 
} 

ティ私は、名前空間、 "クラス:: ..."のことを意味しますか?インターフェイスを継承して使用する方法は?

私は、すべての仮想関数は、私に次のエラーを与え、私はインターフェイスから作られたすべての関数を取得このようなので:

SomeOtherClass.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Cow::Walk (...etc etc...) referenced in function "void __cdecl SomeNamespace::LetAnimalWalk() (...etc etc...) 

は、私はほとんど見つける何をすべきか、私が間違ってやっている誰もが知っていますあなたは、その関数を定義するか確認する必要があり、それは私が、関数の右(Cow.cppでどこかを??)宣言していませんでした手段は、事前みんなで

おかげ

+2

'myCow.Walk();はtypoですか?この関数は 'walk()'(小文字)と呼ばれます –

+0

ああ、typoなのです。私はここで手作業で入力しました。本当のクラスは難しいですが、stackoverflowにはあまりにも多すぎると思います。 ! –

+0

@AndyProwlあなたは同じような質問で、昨日も私を助けようとしました。もっと具体的なAndy ..私は答えましたが、あなたがそれを読んだとは思いません...私の他の投稿は:http://stackoverflow.com/質問/ 15226986/c-lnk-error-2019-unresolved-external-symbol-virtual-errors-of-an-inter#コメント21465084_15226986 –

答えて

9
class Animal 
{ 
public: 
    virtual void walk(); 
} 

ですそれは純粋な仮想です。あなたが得るこのなし

class Animal 
{ 
public: 
    virtual void walk() = 0; 
} 

+0

しかしそれはバーチャルな権利ですか?だから私は牛::歩く..私はそれを定義.. ..または? –

+0

基本クラスの関数が純粋な仮想でない場合は、それをAnimalクラスでも定義する必要があります。それがAnimalの純粋な仮想であれば、Cowで定義するだけです。また、仮想関数は、通常、 'Animal * animal = new Cow(); animal-> walk(); 'これは、牛クラスのwalk関数を呼び出します。 –

+0

ええと、私は今もそれを試しました..!そのように使用することをお勧めしますが、それでも同じエラーが残ります...... –

4

あなたは、基本クラスで定義したくない仮想関数を持っている場合、あなたはそれが抽象的にする必要があり、これは次の構文を使用して行われますそれが定義されていないとエラーが発生し、派生クラスがそれを定義していない場合はエラーが発生します。

+0

ああ私の悪い、私はそれを持っている...!それはすでに純粋な仮想だった..しかし、まだ同じエラーがあります! –

2

いずれかの仮想基底クラスの関数は純粋する:

class Animal 
{ 
    public: 
     virtual void walk() = 0; 
} 

または些細な実装を定義:

void Animal::walk() 
{ 
    return; // could also throw an exception here 
} 
+0

私はあなたが言ったように、この些細な実装(私は純粋なバーチャルにしました、私は実装を定義した、私は同じ時間に両方をした...しかし、私のエラーは同じままです –

+0

はい、あなたのコードは明らかに簡略化されているので、あなたが欠落している '#include 'ディレクティブを全て持っていると仮定します(そうでなければ、リンクステージの前にエラーが出てくるはずです)。 'Cow.cpp'はあなたのプロジェクトやmakefileの一部ですか? – jerry

+0

私はVS2012を使用しています...実際には、私は本当に質問に入れていませんでした! Ehm、Cow.cpp私が見た限り私は実際に確かにチェックするつもりです 私のVS2012、ちょうどそのプロジェクトに含まれている...!:\ –

1

動物を動物* =新しい牛()。動物 - >歩行();

牛myCowは明らかに機能しません!

+0

実際には '牛'オブジェクトに 'walk()'を直接呼びます。 ld work(リンカーエラーを出さない)。あなたが通常ポインタを使って仮想関数を呼び出す理由は、仮想関数が実際に呼び出されていることを確認することです(私はhttp://ideone.com/UteSxTで簡単な例を書いています)。この問題が解決されたという事実は、他に何か起こっていることを私に伝えています。 – jerry

関連する問題