2

私は次のような機能を持っています

void Element::setNodes(const BaseClass& input0, const BaseClass& input1)

これは、派生クラスを渡すことによって呼び出されます。

setInputNodes(DerivedClass1, DerivedClass2)

私が抱えている問題は、ノードをベクトルに格納したいということです。私はこれを持っています

std::vector<std::shared_ptr<BaseClass>> m_inputNode;

と関数

void Element::setNodes(const BaseClass& input0, const BaseClass& input1)
{
m_inputNode.push_back(input0);
m_inputNode.push_back(input1);
}

これは機能せず、ポインターとして保存する必要があります。そうしないと、オブジェクトのスライスが発生します。API を変更してポインターを渡す必要がありますか? 少しでも変えたい。

4

3 に答える 3

3

他の誰かがベクター要素の有効期間を管理していることがわかっている場合std::vector<const BaseClass*>は、型として使用し、&input0要素をベクターにプッシュするときに etc. を使用します。

ここでポインターを使用するのは困難std::shared_ptrです。使用する時点では、オブジェクトがどのように作成されたかがわからないからです。

参照を保持したい場合は、いつでもstd::reference_wrapper;で囲むことができます。タイプとして設定std::vector<std::reference_wrapper<const BaseClass>>します。しかし、所有権の問題は依然として蔓延しています。ダングリング参照のベクトルになってしまう可能性があります。

于 2015-10-20T12:20:12.847 に答える
2

とおっしゃっていたので、

オリジナルへのポインタ/参照が必要です。

唯一の選択肢は、を削除しshared_ptrて非所有ポインターを使用することです。

std::vector<BaseClass const*> m_inputNode;

void Element::setNodes(BaseClass const& input0, BaseClass const& input1) {
    m_inputNode.push_back(&input0);
    m_inputNode.push_back(&input1);
}

(ポインタ以外constが必要な場合は、すべての s を削除してください。)const

shared_ptr基本的に所有権を表現していますが、これはあなたが求めているものではないようです。

しかし、私があなたを誤解していて、実際にオブジェクトの (共有) 所有権をベクターに付与したい場合は、共有ポインターを介してオブジェクトを関数に渡す必要があります。

void Element::setNodes(std::shared_ptr<BaseClass> input0, std::shared_ptr<BaseClass> input1) {
    m_inputNode.push_back(input0);
    m_inputNode.push_back(input1);
}
于 2015-10-20T12:29:38.217 に答える