2016-04-17 31 views
0

継承を含むコードをコンパイルしようとしています。..constructorの呼び出しで一致する関数がありません

#include "MapEntityClass.h" 

class RectangularEntityClass:public MapEntityClass 
{ 
    public: 
    void drawOnMap(MapClass *mapObj) const; 

    protected: 
}; 

親クラスはMapEntityClassで、デフォルトのコンストラクタはありませんが、値コンストラクタがあります。コンパイルすると、次のエラーが発生します。

RectangularEntityClass.h: In constructor ‘RectangularEntityClass::RectangularEntityClass()’: 
RectangularEntityClass.h:12:7: error: no matching function for call to ‘MapEntityClass::MapEntityClass()’ 
    class RectangularEntityClass:public MapEntityClass 
^
RectangularEntityClass.h:12:7: note: candidates are: 
In file included from main.cpp:1:0: 
MapEntityClass.h:32:5: note: MapEntityClass::MapEntityClass(const PixelLocationClass&, const ColorClass&) 
    MapEntityClass(
    ^
MapEntityClass.h:32:5: note: candidate expects 2 arguments, 0 provided 

何が悪いと思いますか?

+2

クラスが今あるので、コンパイラはRectangularEntityClassのデフォルトコンストラクタを作成します。この実装では、親クラスのデフォルトのコンストラクタを呼び出そうとします(デフォルト動作)。 MapEntityClassの値コンストラクタを適切な値で呼び出すために、RectangularEntityClassのデフォルトのコンストラクタを自分で定義したい場合があります – Bettorun

+0

hmm、あなたはrectangularEntityClassのデフォルトのコンストラクタを意味しますか? – nm17

+0

ええ。 MapEntityClassに使用するコンストラクタを指定するために – Bettorun

答えて

0

継承では、親クラスにコンストラクタまたはデフォルトコンストラクタのみがない場合にのみ、サブクラスにコンストラクタが必要なくなります。

いずれにしても、親クラスにパラメータ化されたコンストラクタがある場合、サブクラスには親クラスコンストラクタを呼び出すパラメータ化されたコンストラクタが必要です。

例:

class A { 
    int aVal; 
    public: 
     A(int); 
}; 

A::A(int aVal) 
{ 
    this->aVal = aVal; 
} 

class B : public A { 
    int bVal; 
    public: 
     B(int, int) 
}; 

B::B(int aVal, int bVal) : A(aVal) 
{ 
    this->bVal = bVal; 
} 
+0

最後の関数では、代わりに次のように書くことができます:B :: B(int aVal、int bVal) { A(aVal); this-> bVal = bVal; } – nm17

+0

いいえ、できません。 http://stackoverflow.com/questions/21395395/calling-a-constructor-of-the-base-class-from-a-subclass-constructor-body/21395443?noredirect=1#21395443 – aliasm2k

+0

ああそうです基本的にそのクラスのインスタンスオブジェクトを作成しようとしていますか? – nm17

関連する問題