Ich gebe die folgenden Codes, um meine Frage zu veranschaulichen. Angenommen, LargeClass
ist eine Klasse enthält viele interne Variablen wie die folgenden Codes zeigen.Möglichkeiten zum Einbau großer Klassenelemente in C++
class LargClass
{
public:
std::vector<int> abc={1,2,3, ...., 10000};
}
Nehmen wir nun an LargeClass
ein Element einer anderen Klasse wird Abc
wie die folgenden Codes zeigen:
class Abc
{
public:
std::vector<LargeClass> obj;
};
Als std::vector<LargeClass>
sehr kostspielig ist initialisiert zu werden, wenn Abc
Klassenobjekt aufgebaut ist, ist eine mögliche Lösung ist, Konstrukt std::vector<LargeClass>
Element nach Abc wird als die folgenden Codes aufgebaut:
Statt std::vector<LargeClass>
in eine teure Art und Weise initialisiert werden:
class Abc
{
public:
Abc(std::vector<LargeClass> objTemp)
{
obj = objTemp;
}
}
Natürlich gibt es andere Lösungen. Eine Lösung ist, Zeiger
class Abc
{
public:
Abc(std::vector<LargeClass> &obj)
{
pObj = &obj;
}
std::vector<LargeClass> *pObj;
}
Mit dieser Lösung zu verwenden, jedoch müssen wir sicherstellen, dass die gegebenen std::vector<LargeClass> &obj
existiert immer während der Lebensdauer der Klasse Abc
. Um dieses Problem zu lösen, ist eine andere Lösung zu verwenden shared_ptr
:
class Abc
{
public:
Abc(boost::shared_ptr<std::vector<LargeClass>> obj)
{
pObj = obj;
}
boost::shared_ptr<std::vector<LargeClass> > pObj;
}
Also meine Frage ist: Welche Lösung ist besser? Für mich bevorzuge ich das erste, aber es entspricht nicht den Regeln der objektorientierten Programmierung. Irgendwelche Vorschläge?
Der Fall, dass ein vorinitialisierter Vektor an den Konstruktor übergeben wird, muss nicht teuer sein, wenn der Aufrufer std :: move (http://en.cppreference.com/w/cpp/utility/move) verwendet, wenn Übergeben sie an den Konstruktor – nate
müssen diese Instanzen von 'LargeClass' unabhängig von' ABC' existieren oder kann 'ABC' das komplette Eigentum übernehmen? – user4581301
In Ihrem Beispiel ist der Vektor der Eigentümer, und der Move-Konstruktor übergibt den Besitz von einem Vektor an den nächsten – nate