2016-08-03 15 views
0

私が画面上にレンダリングするアイテムを表現するための構造体を作成する場合、および含まれていますC++:ヌル・ポインタと構造体

  1. 原住民「renderables」(meshestriangles、など)のリスト
  2. 他人へのポインタサブ構造

これを行います:

struct RenderGroup { 
    std::vector<RenderGroup*> Children; 
    std::vector<Renderable> Renderables; 
} 

これを行う最善の方法は何ですか?サブ構造がない場合は、ベクターにヌルポインタを置くことはできますか?

編集:悪いタグstd::vectorに任意の「何もない」レコードを入れる必要はありません

+5

サブ構造がない場合は、* anything *をベクターに入れません。 – Galik

+0

あなたのグラフでヌルポインタが適切かどうかを尋ねなければならない場合は、悪い時が来るでしょう。 –

答えて

1

は固定されていない大きさであるので、その中に要素がない場合、size0を返し、空であろうtrueを返します。

std::vector<int> v; 
auto sz = v.size(); // sz has value 0 
auto e = v.empty(); // true 
v.push_back(42); 
sz = v.size(); // 1 
e = v.emi empty(); // false 

あなたはまた、

std::vector<int> v { 1, 2, 3 }; 
auto it = v.find(2); 
if (it != v.end()) 
    v.erase(it); // v now contains 1, 3 

ので、理論的には、ありませんあなたがnullptr Sを配置する必要はありません(ベクトルがギャップを埋めるために、すべてのfollowingv要素を下に移動)の要素を削除することができますベクター。これは、ベクター内の特定の母集団サイズを必要としない方法でアプリケーションを設計したことを前提としています。もしそうなら、ベクトルは正しいコンテナではないかもしれません。 std :: arrayを考えてみましょう。

レンダラブルベクタには問題があります。ベクタは、Renderableのベクタを格納します。私がベクトルである要素は、Renderableのサイズとまったく同じです。そのため、派生クラスを試して保存すると、たとえばMeshのように、派生クラスの余分なフィールドは失われます。

これはスライシングと呼ばれます。https://en.m.wikipedia.org/wiki/Object_slicing

あなたがオブジェクトのインスタンスへのポインタまたは参照を格納する必要があります。インスタンスの存続期間と所有権によって異なります。

あなたのベクトルがremediablesを所有している場合は、std::vector<std::unique_pre<Remediable>>を使用することができます。

あなたはおそらくstd::shared_ptr、あなたの発信者からのインスタンスを与えられている場合。

+0

あなたの有益な答えをありがとう。どのようにスライスの問題を解決するには?ポインタ? – PearlSek

1

、これはあなたが区切り文字のいくつかの種類で終了しなければならない可変長のCスタイルの配列のようではありません。ちょうど空にしておきます

通常、このようなリストにNULLを入れないでください。何かがコンテンツを繰り返し処理し、そのポインタを再参照してクラッシュする可能性があります。

+3

「NULL」も避けてください。 'nullptr'を使います。 –

+0

'nullptr'は、一部の古いバージョンのC++では定義されていません。 –

+0

@ MarkLakata良い点ですが、あなたがそれをどのように指定しても、 '0'かそうでなければ、無効なポインタはそのリストにあるべきではありません。 – tadman

0

RenderGroupが基本クラスで、ChildrenベクトルがRenderGroupの任意の子クラスを格納している場合、この方法は「きれいです」(スマートポインタはおそらく推奨されますが)。

しかし、前述のように、ポインタを使用してRenderGroupの不在を表すポインタを使用している場合は、不要になったベクトルを削除するだけで済みます。

0

この構造は助けることができるかどうかを参照してください:子供(RenderGroup)オブジェクトの

struct RenderGroup { 
    std::map<Renderable, std::vector<RenderGroup*>> Renderables; 
} 

リストがレンダリング可能オブジェクトにマッピングされます。

std::vector
関連する問題