2016-12-11 6 views
0

私は2つのクラスを持って、1それは抽象クラスからのパラメータです継承したクラス:2つのオーバーロードされたコンストラクタを持っているオブジェクトを別のクラスコンストラクタのパラメータとして渡すにはどうすればよいですか?

class Child : public Base { 
public: 
    Child(string s, int i,) : Base(s, i){}; 
    ... // methods 
}; 

と別のは、一つは通常のパラメータを使用し、別のは、同じパラメータを取得しますが、最初のクラスから既存のオブジェクト:

ヘッダファイル:

class Other { 
private: 
    string s; 
    int i; 
    Child o; 
public: 
    Other(string str, int num); 
    Other(Child ob); 
}; 

CPPファイル:

Other :: Other(string str, int num) : s(str), i(num) {/* this is where the error happens*/}; 
Other :: Other(Child ob) : o(ob) { 
}; 

しかし、私はマークされた場所でエラーを取得するコンパイルしようと、「C2512 『その他』:いいえ、適切なデフォルトコンストラクタが利用できる」

を問題に何ができますか? OtherChildメンバーを持っているので、これが発生し

Other :: Other(string str, int num) : s(str), i(num), o(str, num) {} 
+0

'Child'のデフォルトのコンストラクタは何ですか? –

+0

はありません。私は既存の値で 'Child'オブジェクトを初期化する必要があります – Yokubasu

+0

メンバー初期化子リストでそれを行うだけですか? http://stackoverflow.com/questions/1711990/what-is-this-weird-colon-member-syntax-in-the-constructor –

答えて

1

Child::Child()はありません。エラーラインのイニシャライザリストにoをリストしていないので、Child::Child()が呼び出されています。この空のコンストラクタは、他のコンストラクタがない場合に自動的に追加されます。 Child::Child(string s, int i)があると、コンパイラはChild::Child()を自動的に作成しません。

+0

これは愚かな間違いでした。私は大学でソフトウェアエンジニアリングを学びました。なぜなら、私は学校のITクラスでそれが好きだったからです。しかし、このOOP、ポインタなどのハイエンドのものはすべて私を驚かせています。このサイトの他の人のコードを見ると、私は本当に落胆してしまい、私は決して良いプログラマーにならないように感じます – Yokubasu

2

を、そのオブジェクトを渡すためにする必要がありますChildにデフォルトのコンストラクタ(引数を取らないコンストラクタ)を指定していません。 Childにはデフォルトのコンストラクタがありませんので、コンパイラはChildのインスタンスを作成する方法を知らないので、それを伝えなければなりません。

Other :: Other(string str, int num) : s(str), i(num), o(some_value_of_type_Child) {}; 
0

ています:あなたは子オブジェクトを作成する必要が

Other :: Other(string str, int num) : s(str), i(num) 

:私は本当にここではコンストラクタに

+1

また、値をコンストラクタに渡す必要があるクラスのインスタンスそのコピーCTORがオーバーロードされました。この子の正規のクラス定義はどこにありますか?私はそれを見たいと思います。 –

0

私はちょうどここに推測しているが、私は、文字列と整数を取るOtherコンストラクタがChildオブジェクトを構築するためにこれらの引数を使用することになっている疑いがあります。

Other:: Other(string str, int num) : o(str, num) {} 

をそしてもちろんOtherクラスからsiメンバ変数を削除します。

その後は、この代わりのようなものを行う必要があります。

+0

私は初期化されたChildオブジェクトを持っています。そして、他のコンストラクタに直接値を入力するか、Childオブジェクトを渡してその値を使用することによって、Otherクラスオブジェクトを作成できるようにします。 – Yokubasu

+0

@ Yokubasuしたがって、2つの引数を持つ 'Other'コンストラクタの目的は何ですか?何の主張ですか? –

+0

私のプログラムに文脈を入れるために、私は人間開発指数(Human Development Index:HDI)を計算するクラスを書いています。これを行うには、別のクラスで行った他の小さなインデックスを計算し、それらを計算する必要があります(Baseクラスから継承した国のさまざまな統計が必要です)。私がしたいのは、ユーザーに選択肢を与えることです:もし彼が国の統計を持っていれば、インデックスクラスのオブジェクトを使ってコンストラクタを使いますが、インデックス自体はありますが統計はないので、もう一方のコンストラクタを使います。このプログラムには実際の使用はありません。私は宿題の要件を満たすことを試みています。 – Yokubasu

関連する問題