0

私は次のクラスを持っています。

class Row
{
   Table* parent_table;
   Row(Table* construct);
}
class Table
{
    std::vector<Row>;
}

を作成std::vector<Table> test;し、ループで Table オブジェクトを作成し、それらをテスト ベクトルにプッシュします。問題は、各行内で Table* を失うことです。ポインターが必要なため、行を反復処理すると、行がどのテーブルに属しているかがわかります。

オブジェクトがプッシュバックされたときにオブジェクトをコピーするのではなく、std::vector を強制する方法はありますか?

4

4 に答える 4

4

Rowに保存する代わりにstd::vector、storestd::unique_ptr<Row>またはstd::shared_ptr<Row>. これらは、この種のものには十分である傾向があります (生のポインターを格納する (維持するのが複雑)、独自のpImplベース クラスをロールする、カスタム セマンティクスを使用して独自のスマート ポインターを作成するなど、より複雑な方法でこれにアプローチできます)。

unique_ptr移動のみをサポートするため、コピーの問題を回避できます。 shared_ptr代わりに共有所有権をサポートしますが、これはおそらく必要のないものです。を使用することをお勧めしunique_ptrます。

于 2013-03-13T13:53:13.597 に答える
1

参照またはポインターによって要素をプッシュします。コピーをプッシュしているため、要素をコピーするだけで C++ が実行できます。個人的には、次のようなポインターのベクトルを使用することをお勧めします。std::vector<Row*>

実際には、より安全でクリーンな方法は、ベア ポインターの代わりに shared_ptr-s を格納することです。これにより、メモリ管理をそれほど処理する必要がなくなります。何かのようなもの:

std::vector<std::shared_ptr<Row> >

于 2013-03-13T13:51:12.487 に答える
1

あなたは2つの無関係な質問をしています。1つの投稿でそれをしないでください。1 つの投稿 - 1 つの質問。これにより、回答が非常に簡単になります。

2番目:

オブジェクトがプッシュバックされたときにオブジェクトをコピーするのではなく、std::vector を強制する方法はありますか?

すでに他の人が答えています。

最初:

std::vector test; を作成し、ループで Table オブジェクトを作成してテスト ベクターにプッシュします。問題は、テーブル内の行内でテーブル * を失うことです。ポインターが必要なため、行を反復処理すると、行がどのテーブルに属しているかがわかります。

ほとんどの場合、ROW には、それを含むテーブルへの後方参照が含まれていません。そうすれば、行のベクトルまたは行自体を渡すと、その所有者に関する情報が失われます。a-vector-of-rows をtable* owner、またはと一緒に行を渡すかtable* owner、Row をよりインテリジェントにして、すべての Row に a を強制的に含めるtable* owner(つまり、Row に所有者への後方参照を含める) 必要があります。

もちろん、後方参照はどのような形でもかまいません。ポインターである必要はありません。Table&、 a shared_ptr<Table>、 astring tablenameなど、直接またはマネージャーを介してテーブルにアクセスするのに役立つものを渡すことができます。重要なことは、行にそれが含まれている必要があるか、行と一緒に別々に渡される必要があるということです。

于 2013-03-13T13:57:08.663 に答える
0

この場合の最も簡単な解決策は、おそらくイテレータをテーブルに格納することです。

class Row
{
    std:vector<Table>::iterator parent_table;
    Row(std:vector<Table>::iterator construct);
}
于 2013-03-13T13:54:22.507 に答える