2013-05-04 5 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 говорит мне: «Невозможно создать экземпляр из абстрактного класса».

Я не уверен, где я ошибся. Благодарим вас за помощь.

Edit: По запросу вот 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

Существует чистая виртуальная функция-член 'CBaseStructure', которая' clsMapping' не является переопределяющей. Можете ли вы показать определение «CBaseStructure»? –

ответ

3

CBaseStructure должен быть абстрактным классом. Если вы хотите извлечь из него и вы хотите не-абстрактный класс, тогда вы должны переопределить каждую чистую виртуальную функцию, объявленную CBaseStructure. Очевидно, вы этого не делали.

РЕДАКТИРОВАТЬ

CBaseStructure имеет одну чистую виртуальную функцию ProcessTxtLine. Ваш класс должен переопределить эту функцию.

В коде отсутствует что-то, что объясняет, почему вы наследуете от CBaseStructure, что вы будете делать для вас?

+0

А, отлично, спасибо. Я не знаю, почему я добавил это вообще. Я просто удалил «: public CBaseStructure», и он сработал. Спасибо. – tmighty

+0

Большое спасибо за хорошее объяснение, это было действительно полезно! – tmighty

+1

CBaseStructure накладывает определенные надежды на любой класс, который вытекает из него, вы не соответствовали этим ожиданиям, поэтому ваш код не компилировался. Я советую отказаться от случайно выбранных классов в будущем. Или, действительно, произвольная запись кода.Это вряд ли сработает. – john

0

Глядя на ваш CBaseStructure, обратите внимание на чистую виртуальную функцию декларации следующих protected:

virtual void ProcessTxtLine(string line) = 0; 

Любой класс с чистой виртуальной функцией является абстрактным классом, и абстрактные классы не могут быть инстанцированными (думать о том, почему: они не имеют никакого кода для реализации определенных функций, которые, как они утверждают, поддерживают).

Таким образом, абстрактные классы являются классами, которые содержат чистые виртуальные функции, которые для базового класса требуют производный класс, обеспечивающий реализацию.

В вашем случае ваш clsMapping класс должен обеспечить реализацию для ProcessTxtLine.

Итак, что произойдет, если вы этого не сделаете? Ну, ваш производный класс «наследует» чистую виртуальную функцию, которую он не переопределяет, а потому тоже становится абстрактным классом. И как мы уже установили, абстрактные классы не могут быть созданы.