2011-08-13 6 views
2

Amは、このコンパイラエラーを取得抽象クラスをインスタンス化することはできません。 <someclass>は抽象クラスではありません。エラーをクリックしたときやポインタポイントがエラーC2259:「<someclass>は」:VS 6 VC++コードをコンパイルしようとしているときに

void resize(size_type _Newsize, _Ty _Val)  
{  
    if (_Mysize < _Newsize) 
     _Insert_n(end(), _Newsize - _Mysize, _Val); 
    else 
    while (_Newsize < _Mysize) 
     pop_back(); 
} 

奇妙な関数の最初の行でシステムファイルを一覧表示します。任意のソリューション。クラス、

class SomeClass: public parentObject 
{ 

    public: 
    SomeClass() {} 
    SomeClass(const someotherclass& p, double uu, double vv) 
     { z= p; u = uu; v = vv; } 
protected: 
    double  u, v;  
    someotherclass z; 
}; 
+0

質問1:Visual Studio 6?本当に?質問2:あなたのクラスのコードを投稿してください - できれば、バーハイアを再現する最小化バージョン? –

+0

'someclass'とは何ですか?エラーメッセージはどの行に対応していますか? –

+0

あなたは抽象クラスではないと言っていますが、明らかにコンパイラはそう考えています。コンパイラが正しいと私は賭けている。 – SoapBox

答えて

8

クラスのインスタンスは、純粋仮想メンバーがある場合は作成できません。それらの純粋仮想メンバーがそのクラスで宣言されたか、基底クラスで宣言されたかどうか。すべてのメンバーが存在しない限り、クラスを作成することはできません。純粋仮想メンバー(クラスまたは基本クラスで宣言されているかどうかに関係なく)を持つクラスは、抽象クラスと呼ばれます。

あなたは純粋仮想メンバーを持つ基本クラスから継承する場合は、(std::vectorでそれらを置くように)、そのクラスのインスタンスを作成したいのであれば、あなた派生クラスでこれらを実装する必要があります。

あなたはstd::vectorに抽象クラスへのポインタを置くことができます。しかし、ポインタだけではなく、オブジェクト自体です。したがって、オブジェクトをnewで割り当てる必要がありますが、クラスが抽象クラスであるため、それらを全く作成できません。したがって、純粋仮想メソッドを実装する新しいクラスを派生する必要があります。そのクラスを作成してstd::vector<someclass*>に入れることができます。

+0

私はあなたの答えが助けてくれることを願っています。私にチェックさせてください。 –

関連する問題