私の質問を説明するために、次のコードを書いています。 LargeClass
がクラスであり、次のコードが示すように多くの内部変数を含んでいるとします。 Abc
クラスオブジェクトが構築されるときに初期化することが非常に高価である大きなクラスの要素をC++に組み込む方法
class Abc
{
public:
std::vector<LargeClass> obj;
};
std::vector<LargeClass>
ように、一つの可能な解決策はである:
class LargClass
{
public:
std::vector<int> abc={1,2,3, ...., 10000};
}
を、以下のコードが示すようLargeClass
が別のクラスAbc
の要素となると仮定しますAb30の後に構成要素std::vector<LargeClass>
が次のコードとして構成されます。
Abc abcObj;
abcObj.obj.resize(3);
....
...
の代わりにコストのかかる方法でstd::vector<LargeClass>
を初期化します。もちろん
class Abc
{
public:
Abc(std::vector<LargeClass> objTemp)
{
obj = objTemp;
}
}
他のソリューションがあります。一つの解決策は、このソリューションを使用すると、ポインタ
class Abc
{
public:
Abc(std::vector<LargeClass> &obj)
{
pObj = &obj;
}
std::vector<LargeClass> *pObj;
}
を使用することです、しかし、私たちは、与えられたstd::vector<LargeClass> &obj
は常にクラスAbc
の寿命の間に存在することを確認する必要があります。この問題を解決するために、別の解決策はshared_ptr
を使用することです:
class Abc
{
public:
Abc(boost::shared_ptr<std::vector<LargeClass>> obj)
{
pObj = obj;
}
boost::shared_ptr<std::vector<LargeClass> > pObj;
}
だから私の質問は:優れているソリューション?私にとっては、最初の方が好きですが、オブジェクト指向プログラミングのルールに合っていません。助言がありますか?
呼び出し元がstd :: move(http://en.cppreference.com/w/cpp/utility/move)を使用している場合、事前に初期化されたベクトルをコンストラクタに渡す場合にコストがかかることはありませんそれをコンストラクタ – nate
に渡すと、 'LargeClass'のこれらのインスタンスは' ABC'とは独立して存在する必要がありますか、 'ABC'は完全所有権を取ることができますか? – user4581301
あなたの例では、ベクトルは所有者であり、移動コンストラクタはあるベクトルから次のベクトルに所有権を渡します – nate