0

私は次のクラスを持っています:

(ヘッダ)

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;

しかし、コンパイラは「抽象クラスからインスタンスを作成できません」と言います。

どこで間違ったのかわかりません。お手伝いありがとう。

編集:リクエストに応じて、ここに 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

2 に答える 2

3

CBaseStructure は抽象クラスでなければなりません。それから派生させ、非抽象クラスが必要な場合は、CBaseStructure が宣言する各純粋仮想関数をオーバーライドする必要があります。明らかにあなたはそれをしていません。

編集

CBaseStructure には 1 つの純粋仮想関数がありますProcessTxtLine。クラスはその関数をオーバーライドする必要があります。

あなたのコードには、CBaseStructure から継承している理由を説明するものは何もありません。

于 2013-05-04T19:21:58.207 に答える
0

を見て、次の純粋仮想関数の宣言CBaseStructureに注意してください。protected

virtual void ProcessTxtLine(string line) = 0;

純粋仮想関数を持つクラスはすべて抽象クラスであり、抽象クラスはインスタンス化できません (理由を考えてみてください。サポートすると主張する特定の関数を実装するコードがありません)。

したがって、抽象クラスは、基本クラスが派生クラスが実装を提供する必要がある純粋仮想関数を含むクラスです。

あなたの場合、clsMappingクラスはの実装を提供する必要ProcessTxtLineがあります。

そうしないとどうなりますか?さて、派生クラスは、オーバーライドしない純粋な仮想関数を「継承」するため、それも抽象クラスになります。そして、すでに確立したように、抽象クラスはインスタンス化できません。

于 2013-05-04T19:26:12.667 に答える