2017-04-18 3 views
0
#include <iostream> 
#include <string> 

struct A { 
    A(std::string s) { name = s; } 

    std::string name; 
}; 

struct B { 
    B(std::string s) : a(A(s)) {} 

    A& a; 
}; 

int main() { 
    B b("tom"); 

    std::cout << b.a.name << std::endl; 
} 

class BのA &aにA's objectを割り当てようとしています。私はそれをすることができる方法のカップル。リファレンスを使用してメモリを割り当てるのを避けるには?

1)をA * aにし、Bのコンストラクタ内でa = new A(s)を実行します。これは機能しますが、私は新しいや削除をしなければならないので、これを避けようとしています。

2)上にはclass Bがあり、これは文字列を受け取り、左辺値参照を初期化するrvalueオブジェクトを作成します。これにより、コンパイルエラーが発生します。

3)私はA& aA&& aにすることができますが、これが良いかどうかはわかりません。それはコンパイルしているので、Coutはゴミを出す。

4)Aのインスタンスをmainに作成し、Bのコンストラクタに渡します。しかし、今のところこれを避けようとしています。

+0

を_「私は 'クラスB'のを割り当てるしようとしていますAとAのオブジェクトがある。_それはどういう意味ですか? –

+0

あなたのコードは整形式ではありません。 'B :: a'を' A(s) 'から初期化することはできません。前者は左辺値、後者は右値です。 –

+1

@KerrekSB:はい、問題はそれを認めます(ポイント#2) –

答えて

4

参照やポインタなどの必要はありません。

タイプAのオブジェクトを必要とするだけで簡単です。

プラス、あなたは移動のセマンティクスを使用して、すべてのコピーを避けることができます。

#include <iostream> 
#include <string> 
#include <utility> 

struct A 
{ 
    A(std::string s) : name(std::move(s)) {} 

    std::string name; 
}; 

struct B 
{ 
    B(std::string s) : a(std::move(s)) {} 

    A a; 
}; 

int main() 
{ 
    B b("tom"); 

    std::cout << b.a.name << std::endl; 
} 
+0

@vantamula:あなたが心配していた文字列ですか?あなたの質問は言いません。 –

+0

Aのインスタンスをmainに作成してBに渡したかったのですが、AをBの中に入れたいだけでした。 –

+0

'A()= default'を使うことができ、Bのコンストラクタの中でAのインスタンスを作成しようとしましたその努力が必要であるかどうかは確かではありませんでした。 –

2

正しいと良いコードは次のようになります。

struct A 
{ 
    A(std::string name) : name_(std::move(name)) {} 

    std::string name_; 
}; 

struct B 
{ 
    B(std::string name) : a_(std::move(name)) {} 

    A a_; 
}; 
関連する問題