0

それで、私の最後の質問に取り組んだ後、私はそれをこれに要約しました:

不明な数のユーザー定義クラス(object_c)をに追加する必要がありboost::intrusive::listます。クラスにはconstメンバーがいます。それらをにプッシュするために私がする必要があるのlistは、それらを構築してから永続化させることだけです。それらは自動的に追加されます。

問題のコードは基本的に

for (unsigned i = 0; i < json_objects.count(); ++i) {

    ctor_data = read(json_objects[i]);

    // construct object here

}

私が試したこと:

  1. mallocオブジェクトの配列を作成してから、次のように入力しますconst。メンバーがいるため、機能しません。

    static object_c *json_input = (object_c*) malloc(json_objects.size() * sizeof(object_c));
    
    ...
    
    json_input[i](ctor_data); //error: no match for call to (object_c) (ctor_data&)
    
  2. ポインタの作成:これは機能せず、関数は正しく機能せず、破壊されません

    new object_c(ctor_data);
    
  3. オブジェクトをに押し戻すstd::vectorこれは機能しません。試したときに数十行の暴言をブーストします(ここに出力)

    vector_of_objects.push_back(object_c(ctor_data));
    
  4. くそったれを宣言するだけです:明らかに機能せず、すぐにスコープから外れます(dur)

    object_c(ctor_data);
    

これを行う簡単な方法があると確信しています。誰かアイデアはありますか?私は週末のほとんどの間この問題に直面してきました。

4

3 に答える 3

2

#3使用する必要のある方法である必要があります。エラーが何であるかを詳しく説明する必要があります。

前の質問で示したとおりであり、定義したくない場合は、にいる限りoperator=試すことができます。もちろん、私が話しているのは、に相当するものがあるかどうかを確認する必要があります。編集:私は間違っているかもしれませんが、それはまだ移動セマンティクスをサポートしていないようです。emplace_backC++11std::vectorboost::intrusive

#2または、スマートポインタで使用します。

を使用する場合は、@rasmusが示す#1ように使用する必要があります。placement new

于 2013-01-28T01:26:14.313 に答える
1

ドキュメントの使用法のセクションの最後に、次のように記載されています。

「保存されたオブジェクトの存続期間は、コンテナにバインドされたり、コンテナによって管理されたりすることはありません」

したがって、オブジェクトの存続期間を何らかの方法で管理する必要があります。

1つの方法はstd::vector、ドキュメントの最後の例のように、それらをに含めることです。

于 2013-01-28T01:41:47.910 に答える
0

返信が遅くなったり、試験勉強をしたりしてすみません。

基本的には、私が思っていたよりも簡単でした。また、この回答では、クラスをentity_cと呼んでいるので、のオブジェクトはentity_c実際に意味があります。

私がOPで行っていたのは、自分自身をグローバルに自動的に追加していたときでしpush_backたが、どういうわけかそれが機能しなくなりました。怠惰になるのをやめた後、私は最小限のコンパイル可能なプログラムを作成し、それで遊んだ。構築されたsを格納するためのを作成すると、 (追加されたときにそれらが分解されますが、それが何であるかはわかりません)、動作することがわかりました。次に、ローカルにこれらのオブジェクトを追加し、ローカルリストをグローバルリストに複製するだけで済みました。entity_c intrusive::liststd::vectorentity_c intrusive::list

すべての助けに感謝します、私はplacement new@rasmusによって提案されたように、さまざまなものに合うようにそのプログラムを微調整します(そのおかげで、それは前に見たことがありませんでした)。また、@ karathikのおかげでemplace_new、追加されたこれらすべての新しいC ++ 11機能について調べなければならないかもしれませんが、すばらしい機能がたくさんあります。自分でコピーコンストラクターを作る方法も学びました。
真にそして啓発的な教育経験。

于 2013-01-29T03:17:30.923 に答える