2016-11-28 17 views
0

私はC++の新機能で、これを理解しようとしています。私がコンパイルすると、エラーa nonstatic member reference must be relative to a specific objectが出ます。コードを書く正しい方法は何ですか?これは私がnumShapesが私にエラーを与えている場所です。この静的でないメンバーの参照エラーを見つけることができません

class Application 
private: 
    int numShapes; 
public: 
    Shapes * shapes[numShapes]; 

これは正しいタームであれば、別のヘッダーに私の仮想基本クラスとして持っています。

class Shapes 
{ 
    virtual void draw(char letter); 
    virtual ~Shapes() {} 
}; 

答えて

1

コードShapes * shapes[numShapes];は、numShapesの容量を確保するようにコンパイラに要求しています。問題は、コンパイル時に既知の値を持たないということです。したがって、numshapesを定数にするか、動的メモリ割り当てを調べてください。あなたはshapesからサイズを取得することができますので、

std::vector<Shapes*> shapes; 

が完全にnumShapesを削除します。その代わり

Shapes * shapes[numShapes]; 

+0

私はこの 図形*形状=新しい形[numShapes]を使用して、動的配列にそれを変更しようとしました。 これはエラーです。抽象クラス "Shapes"の配列は使用できません。関数 "Shapes :: draw"は純粋な仮想関数 – brisk172

+0

の意味がわかりません。主なものは、コンパイル時にnuShapesの値を知る必要があることです。または、std :: containersの1つを使用する代わりに、配列を使用しないでください。 e。 g。 std :: vector – MotKohn

+0

@ brisk172動的配列エラーは、draw()を定義しなかったためです。 – jmstoker

0

私はの使用を示唆しています。

コンストラクタ内でshapesを初期化します。次の行に沿った何かがうまくいくはずです。

Application::Application(std::size_t numShapes) : shapes(numShapes, nullptr) {} 
+0

これはうまくいきましたが、別の.cppファイルで別のタイプのエラーが発生しました。ここでは、shape = new Shapes * [numShapes];演算子「=」はこれらのオペランドに一致しないというエラーが返されます。正しいオペランドは何でしょうか? – brisk172

+0

@ brisk172、その質問は、あなたが 'std :: vector'の基本的な理解を得るべきであることを私に示しています。 'std :: vector'の使い方がわからない場合は、私の提案を無視してください。 –

関連する問題