2013-03-07 1 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(); 
} 
,

여기에서 오른쪽에서 파생 된 클래스에서 walk가 취해 졌음을 외부에서 알아야합니까? (e.a. Animal ..) 내가 walknt 함수를 정의 할 때, 나는 그것을 올바르게 정의해야한다고 말할 것입니다 ...?

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(); 
    } 
} 

티 s는 올바르게 작동해야합니까? ... 내 말은, 네임 스페이스, "Class :: ..."것인가? 인터페이스를 상속하고 사용하는 방법은 무엇입니까?

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();는 오타가 있습니까? 이 함수는'walk()'라고 불린다. (소문자) –

+0

오, 그렇다. Typo .. 나는이 모든 것을 손으로 여기에 입력했다. 실제 클래스는 어려운 것이지만, stackoverflow에 대해서 너무 구체적 일 것이라고 생각했다. .! –

+0

@AndyProwl 어제도 좀 더 구체적이었던 같은 질문에 어제 나를 도왔다. Andy .. 나는 대답했다. 그러나 당신이 그것을 읽었다 고 생각하지는 않는다. 내 다른 게시물은 : http://stackoverflow.com/ 질문/15226986/c-lnk-error-2019-unresolved-external-symbol-virtual-errors-of-an-inter #로 인해 comment21465084_15226986 –

답변

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

당신은 그 함수를 정의하거나 할 필요가 그것은 순수 가상입니다. 당신이 얻을 것이다이없이

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

: 당신이 기본 클래스에 정의하지 않으 가상 함수가있는 경우

+0

하지만 그것은 가상의 권리입니까? 그래서 내가 암소를 만들 때 :: walk .. 나는 그것을 정의한다. 또는? –

+0

기본 클래스 함수가 ​​순수 가상 함수가 아닌 경우에는 Animal 클래스에서도 정의해야합니다. 동물에서 순수한 가상의 것이라면 Cow에서 정의해야합니다. 또한 가상 함수는 보통 기본 클래스에 대한 포인터와 함께 사용됩니다. 즉,'Animal * animal = new Cow(); 동물 -> 걷기(); '라고 말하면서, 소는 걷기 기능을 호출합니다. –

+0

흠, 나는 그걸 너무 시도했다 ..! 그런 식으로 사용하는 것이 낫지 만 여전히 같은 오류가 남아 있습니다 ...... –

4

, 다음 구문을 사용하여 추상적,이 작업이 완료를 확인해야합니다 파생 클래스가 정의하지 않으면 오류가 발생합니다.()

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

아, 내 잘못, 나도 그 ...! 그래서 그것은 이미 순수한 가상 ..하지만 여전히 동일한 오류가 있습니다! –

2

어느 순수 가상 기본 클래스 함수합니다

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

또는 사소한 구현 정의 동물 -> 도보();

암소 myCow가 분명히 작동하지 않습니다!

+0

당신이 말했듯이이 사소한 구현 (나는 순수 가상으로 만들었고 구현을 정의 했었고 동시에 두 번 모두 했었지만 ... 내 오류는 동일하게 유지됨 –

+0

예, 질문 수정 , 죄송합니다. 코드가 분명히 단순화되어 있으므로, #include 지시문을 모두 빠뜨렸다 고 가정합니다. 그렇지 않으면 링크 단계 전에 오류가 발생합니다. 어떤 개발 플랫폼을 사용하고 있습니까? 당신은 확실히'Cow.cpp' 프로젝트 또는 makefile의 일부입니까? – jerry

+0

나는 VS2012를 사용하고 있습니다 ... 그리고 실제로, 나는 정말로 여기에 질문을 넣지 않았습니다! Ehm, Cow.cpp까지 제가 본 것입니다. 솔루션의 일부입니다. 내가 실제로 확인해 보겠습니다. 맞아요, 내 VS2012, 그냥 프로젝트에 포함되어 있습니다 ...! : \ –

1

동물 동물 * = 새로운 소;

+0

사실 '암소'개체에 직접 'walk()'를 호출합니다. 작업 (링커 오류를주지 않음).일반적으로 포인터를 통해 가상 함수를 호출하는 이유는 가상으로 사실상 호출되는지 확인하기 위해서입니다 (필자는 http://ideone.com/UteSxT에서 간단한 예제를 작성했습니다). 이 문제로 인해 문제가 해결되었다는 사실을 알게되었습니다. – jerry

관련 문제