2011-11-30 15 views
1

私はすぐにサイトを検索して同様の問題を発見していないことを指摘したいと思います。 ノードにオブジェクトを置くことができない人には質問がありましたが、私の問題はこれです。オブジェクトにデフォルトのコンストラクタがなく、クラス定義内にオブジェクトを作成できない場合、どのようにオブジェクトをノードに配置しますか?

オブジェクトをノード内に置くことはできません。オブジェクトのデフォルトのコンストラクタを作成することはできません。少なくとも具体的に

)そのクラス定義の内部ではない:

私が与えられている以下のクラスの雇用者:そこに、このクラスにはデフォルトコンストラクタがありませんし、私は午前あなたが見ることができるように

class Employer 
{  
public: 

    Employer(string x, int a, int b, int c); 

    string getname() const { return name; } 

private: 
    string name; 
    int age, sal, hire; 
}; 

Employer::Employer(string x, int a, int b, int c) : name(x), age(a), sal(b), hire(c) { } 

tは1(!これらはルールです。)

を作成させ、私は以下のクラスノード作成している:あなたは、私はノードのポインタを保持しているノードクラスを作成したい見ることができるよう

class Node 
{ 
public: 
    Employer emp; 
    Node* link; 
    Node(Employer); 
}; 

Node::Node(Employer x) 
{ 
    emp= x; 
    link=NULL; 
} 

をその中にオブジェクトのEmployerがあります。

残念ながら、これは機能しません。 「雇用のEMP;」.....メンバー初期化するデフォルトコンストラクタが見つからない

クラスの雇用主は、デフォルトのコンストラクタを持っていないので、基本的に何が起こるかは次のとおりです。

E2279:私は、次のエラーメッセージを得続けます「Employer emp」ではなく「int n」であった場合と同じように、Nodeクラスのコンパイラはコンパイラによって「認識」されません。

は、だから私の質問はこれです:私はクラスの雇用者には何も追加/変更することなく、ノードのオブジェクト雇用者を置くことができますどのように

(つまり、私はクラスの雇用者へのデフォルトコンストラクタを追加することはできませんも私が追加することができます"友人クラスノード"のようなものですが、ルールはそのままです)

私はプログラミングに慣れていないので、私はまだテンプレートを教えていないので、私は追加したいと思いますそのうちのどれかを使用することは許されません。既に私があなたに与えたツール(クラス、関数、ポインタなど)

答えて

4

初期化子リストでEmployerメンバーの明示的なコンストラクタ呼び出し提供:この例では

class Node 
{ 
public: 
    Employer emp; 
    Node* link; 
    Node(Employer e) : emp(e) { } 
}; 

を、私はあなたが明示的にEmployerのために定義されていませんでしたコピーコンストラクタを、使用することを選択したが、これはとにかくそこにはありますか?通常は、constの参照で引数を取ることを好むだろう:

Node::Node(Employer const & e) : emp(e), link(NULL) { } 

あなたはまた、例えば、追加のコンストラクタを提供することができる:

Node::Node(std::string const & s, int d) : emp(s, 12, d, 24), link(NULL) { } 

(以下、あなたのコンストラクタに入れより良い。)

+0

素晴らしい!できます!返事をくれた皆さん、ありがとう!あなたは本当に助けになりました。そして、どんどん速くなりました! (私は、なぜ私が雇用者を価値あるものではなく、参考にして渡すべきなのかまだ分かりませんが、私はそれを価値によって渡していますが、効いていますが、 ..しかしそれはまだ動くので私は混乱している..) –

2
Node::Node(Employer x) : emp(x) { 
} 
+1

投稿者はプログラミングには新しいと言っていたので、何が起こっているのかの説明は役に立ちました。Kerrek SBの答えを参照してください。 –

+1

はい、説明は有効ですが、ヒントOPを持つことは、もう一つの有効なアプローチです。 *特に、ポスターがプログラミングの初心者ならば。私が雇ったことに名前を付けると本当に便利だろうが、これらのイニシャライザが正式にどのように呼び出されたかは覚えていない;-) –

+0

@ MichaelKrelin-hacker:OPを期待するのは少し難しいかもしれないコロンを参照して、彼女が "コンストラクタ初期化リスト"を調べる必要があることを知っています... –

1

現在、empメンバーを構成している(またはしようとしている)のですが、その後Employer xを割り当てています。 にデフォルト設定されていても、最初に正しく設定すれば、それを実行して上書きするのは無駄でしょう。

使用

Node::Node(Employer x) : emp(x), link(NULL) 
{ 
} 

代わりに。これにより、すぐに正しい値がemplinkになります。

関連する問題