2017-04-18 4 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; 
} 

Ich versuche class B 's A & ein mit A's object zu vergeben. Ein paar Möglichkeiten, wie ich das machen könnte.Wie vermeidet man Speicherzuweisung durch Verwendung von Referenz?

1) Machen Sie A & a zu A * a und machen Sie a = neue A (s) in B's Konstruktor. Das funktioniert, aber ich versuche das zu vermeiden, da ich neu machen und löschen muss.

2) Oben habe ich class B, die Zeichenfolge und erstellt ein Rvalue-Objekt, um lvalue Verweis zu initialisieren. Dies wird einen Kompilierungsfehler ergeben.

3) Ich kann A& a zu A&& a machen, aber nicht sicher, ob das gut ist. Da kompiliert es aber cout gibt Müll.

4) Erstellen Sie eine Instanz von A in main und übergeben Sie sie an Bs Konstruktor. Aber ich versuche das jetzt zu vermeiden.

+0

_ "Ich versuche,' Klasse B' der zuweisen A & a mit 'A's Objekt' _ Was bedeutet das? –

+0

Ihr Code ist nicht gut formatiert. Sie können 'B :: a' nicht von' A (s) 'initialisieren. Ersteres ist ein Referenzwert, letzteres ist ein R-Wert. –

+1

@KerrekSB: Ja, die Frage gibt zu, dass (Punkt # 2) –

Antwort

4

Sie benötigen keine Referenzen, Zeiger oder ähnliches.

Sie brauchen nur ein Objekt vom Typ A, einfach so.

Plus können Sie alle Kopien vermeiden, indem Sie bewegen Semantik:

#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: Ist es die Zeichenfolge Kopien, die Sie sich Sorgen gemacht? Deine Frage sagt nicht. –

+0

Ich wollte keine Instanz von A in main erstellen und an B übergeben. Ich wollte nur A in B setzen. –

+0

Ich könnte 'A() = default' verwenden und versuchen, eine Instanz von A innerhalb des Konstruktors von B zu erstellen Aber war nicht sicher, dass Anstrengungen notwendig waren. –

2

Richtige und guten Code würde wie folgt aussehen:

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_; 
}; 
Verwandte Themen