2013-05-04 3 views
0

의 인스턴스를 만들 수 없습니다 :C++ 나는 다음과 같은 클래스가 추상 클래스

(헤더)

struct udtMapping 
{ 
    int ByteStart; 
    int ByteCount; 
    int iHPUnitID; 
}; 

class clsMapping : public CBaseStructure 
{ 
private: 
    vector<udtMapping> m_content; 

protected: 

public: 
    vector<udtMapping> &Content(); 
    void Add(int i1, int i2, int int3); 
}; 

CPP 파일

:

vector<udtMapping> &clsMapping::Content() 
{ 
    return m_content; 
} 
void clsMapping::Add(int i1, int i2,int i3) 
{ 
    udtMapping n; 
    n.ByteStart = i1; 
    n.ByteCount = i2; 
    n.iHPUnitID = i3; 
    m_content.push_back(n);  
    return; 
} 

지금 내가 말함으로써이 클래스를 사용하고 싶었

clsMapping nMapping; 

그러나 컴파일 r은 "추상 클래스에서 인스턴스를 만들 수 없습니다"라고 알려줍니다.

어디서 잘못되었는지 확신 할 수 없습니다. 도움 주셔서 감사합니다.

편집 : 요청에 여기 추상 클래스 여야합니다 CBaseStructure

class CBaseStructure 
{ 
protected: 
    virtual void ProcessTxtLine(string line) = 0; 
    virtual void AfterLoad(); 
    virtual string CompactLine(string line); 
public: 
    void Load(string file); 
    void Load2(string file); 
    void Load3(string file); 
}; 
+4

'clsMapping'가 오버라이드 (override)하지 않는'CBaseStructure'의 순수 가상 멤버 함수가 있습니다. 당신은'CBaseStructure'의 정의를 보여줄 수 있습니까? –

답변

3

CBaseStructure입니다. 그것으로부터 파생 해, 비 abstract 클래스를 원하면, CBaseStructure가 선언 한 각 순수 가상 함수를 오버라이드 (override) 할 필요가 있습니다. 분명히 당신은 그렇게하지 않았습니다.

편집

CBaseStructure 한 순수 가상 함수 ProcessTxtLine 있습니다. 클래스가 해당 함수를 재정의해야합니다.

CBaseStructure를 상속 한 이유를 설명하는 코드가 사용자의 코드에서 무엇입니까?

+0

아, 좋아, 고마워. 나는 왜 내가 그것을 추가했는지 모른다. 간단히 ": public CBaseStructure"를 제거하고 작동했습니다. 고맙습니다. – tmighty

+0

좋은 설명을 주셔서 대단히 감사합니다. 정말 도움이되었습니다. – tmighty

+1

CBaseStructure는 그 클래스에서 파생되는 모든 클래스에 특정 기대치를 설정합니다. 이러한 기대치를 충족시키지 못해 코드가 컴파일되지 않았습니다. 앞으로 무작위로 고른 수업을 파생시키지 말 것을 권합니다. 또는 실제로 임의의 코드 작성.작동하지 않을 것입니다. – john

0

당신의 CBaseStructure을 보면, 다음과 같은 protected 순수 가상 함수 선언에 유의하십시오 :

virtual void ProcessTxtLine(string line) = 0; 

순수 가상 함수와 모든 클래스는 추상 클래스이며, 추상 클래스는 인스턴스화 할 수 없습니다 (이유에 대해 생각 : 그들은 그들이 지원한다고 주장하는 특정 기능을 구현하기위한 코드가 없음).

따라서 추상 클래스는 기본 클래스 이 필요하며 순수 클래스를 포함하는 클래스로 구현 클래스를 구현합니다.

귀하의 경우 clsMapping 클래스 이어야하며 ProcessTxtLine에 대한 구현을 제공해야합니다.

그렇다면 어떻게됩니까? 자, 파생 클래스는 파기하지 않는 순수 가상 함수를 "상속"하므로 추상 클래스가됩니다. 그리고 이미 설정 한 것처럼 추상 클래스는 인스턴스화 할 수 없습니다.

관련 문제