2016-12-02 7 views
0

2つのシンプルなクラスを作成しようとしていますが、何らかの理由でこのコードがコンパイルされません。それは私が引数なしでpoint :: pointを呼び出していると言っているが、私がpoint :: pointと呼ぶ唯一の時間はmain関数にあり、そこに引数で呼び出す。なぜこのコンストラクタは引数なしで別のコンストラクタを呼び出しますか?

デバッグ時に、ポイントのコンストラクタを呼び出すstring_two_pointsのコンストラクタが見つかりました。

#include <iostream> 
#include <string> 
using namespace std; 
class point{ 
public: 
    int x; 
    int y; 
    point(int x, int y): x(x),y(y){}; 
    point(const point & c): x(c.x), y(c.y) {}; 
    }; 

class string_two_points{ 
public: 
    string type; 
    point x; 
    point y; 
    string_two_points(string type, point & xc):type(type){ 
     x=xc; 
    }; 
    string_two_points(string type, point & xc, point & yc):type(type){ 
     x=xc; 
     y=yc; 
    }; 

}; 

int main(){ 
    point a = point(2,3); 
    point b = point(3,4); 
    string_two_points x = string_two_points(string("abc"),a,b); 
    return 0; 
} 
+0

あなたは各コンストラクタのメンバを初期化することによって固定することができます。したがって、 'string_two_points'を構築すると、' x'のコンストラクタを呼び出すことを含む 'x'を構築します。 –

+0

コンパイラの苦情がどこで発生するか教えてください。 ctorsは、明示的にコーディングしていないために呼び出されることがよくあります。あなたは2つのポイントを表示します。コンパイラはおそらくデフォルトのctorを含むいくつかのものを提供しています。 –

+0

@ DOUGLASO.MOENコンパイラは、ユーザが提供するコンストラクタがある場合、デフォルトのコンストラクタを提供しません –

答えて

2
string_two_points(string type, point & xc):type(type){ 

それは(存在しない)のデフォルトのパラメーターなしのコンストラクタpoint::pointを呼び出すことによって初期化され、デフォルトを取得しますので、このコンストラクタは、point yを初期化されていません。

0

string_two_pointsの両方のコンストラクタは、xyのデフォルトコンストラクタpointを呼び出して、何かを割り当てようとします。
point()は、コンパイラで正しく記述されているように、コンストラクタとして存在しないため失敗します。

0

クラスstring_two_pointsxyという名前pointメンバーを持っているので、string_two_pointsのいずれかの初期化がxyの初期化を含める必要があります。あなたはコンストラクターズメンバー初期化子リストでそれらを初期化する方法について説明していなかったので、あなたが

を書いたかのように、コンパイラが自動的に注意 x=xc;が初期化できません
string_two_points(string type, point & xc):type(type), x(), y() { 
    x=xc; 
}; 

が、それは後に起こる割り当てだ、デフォルトの初期化を追加しました初期化は完了です。

+0

が値の初期化になります。デフォルトの初期化とは異なる動作をすることができます –

0

pointのメンバーが2つあり、いずれのコンストラクタもどちらもデフォルト値が指定されていないため、コンパイラはそれらを初期化する必要があります。それを行うために、デフォルトのパラメータのないコンストラクタを呼び出そうとします。それが存在しないので、エラーが発生します。 `部材として、` `string_two_points`は点Xを有する

class string_two_points 
{ 
public: 
    string type; 
    point x; 
    point y; 
    string_two_points(string type, point & xc) 
    : type(type), x(xc), y(0, 0) 
    { 
    }; 

    string_two_points(string type, point& xc, point& yc) 
    : type(type), x(xc), y(yc) 
    { 
    }; 
}; 
関連する問題