2016-09-17 2 views
-2

私は、一つのクラスオブジェクトをC++の別のクラスオブジェクトに割り当てたいと思っています。一つのクラスオブジェクトをC++の別のクラスオブジェクトに割り当てよう

例: 1匹のクラス犬と別のクラスの猫があります。それぞれのインスタンスを1つ作成します(d1 & c1)。 STLを使いたくない。私は自分のコードでこのステートメントを使いたいです

d1 = c1;

プログラム

class dog 
{ 
    char dc; 
    float df; 
    int di; 
public: 
    void setdata2(char c, float f, int i) 
    { dc = c; df = f; di = i; } 
    void showdata2() 
    { cout <<"char =" << dc <<", float =" << df <<", int =" << di <<endl; } 
}; 


class cat 
{ 
    float cf; 
    int ci; 
    char cc;  
public: 
    void setdata(float f, int i, char c) 
    { cf = f; ci = i; cc = c; } 
    void showdata() 
    { cout <<"float =" << cf <<", int =" << ci <<", char =" << cc <<endl; } 
}; 


int main() 
{ 
    dog d1, d2; 
    cat c1, c2; 

    d1.setdata2('A', 56.78, 30); 
    c1.setdata(12.34, 2, 3); 
    d1.showdata2(); 
    c1.showdata(); 

    d2 = c1;  // Question 1 

    dog d3(c1);  // Question 2 

    dog d4 = c1; // Question 3 

    return 0; 
} 

質問1/2/3別途を答えてください。

答えて

1

演算子オーバーロードについて読むことができます。

ABからimplicitly convertibleある場合種類BのオブジェクトにタイプAのオブジェクトを割り当てることができ、そしてBassignableある - BタイプAのオブジェクトを受け付けるoverloaded代入演算子を持っている場合、または。

カスタムタイプAから無関係タイプBへの変換を定義するには、2通りの方法があります。 Aにはconversion functionを定義するか、タイプBにはconverting constructorを定義することができます。

1)これはコピーアサインです。上記の説明が適用されます。 cat::operator dog()またはdog::dog(cat)またはdog::operator=(cat)を定義してください。

2)これはdirect initializationです。あなたが尋ねたことは譲渡ではありません。暗黙の変換を定義することも同様ですが、オーバーロードされた代入演算子はそうしません。ただし、オーバーロードされたコンストラクタは、代替第3の代替手段になります。

3)これは構文的に割り当てのように見えますが、実際はcopy initializationです。 2)と同じ規則が適用されます。


PS。 2つの変数をd3という名前で定義していることに注意してください。それは誤りです。

+0

あなたの1番目の答えの定義のためのコンパイラ検索の順序で私に電話できますか? – Lavnesh

+0

これは動作していません。@ user2079303 [コードリンク](https://gist.github.com/anonymous/90d6928fdfdbc6287ee0e91b85dc94f2) – Lavnesh

2

"="演算子をオーバーロードするまで、相互に関連しない互いに異なるクラスの2つのオブジェクトを割り当てることはできません。

あなたは、私がC++で別のクラスのオブジェクトに1つのクラスのオブジェクトを割り当てるhere

関連する問題