1

質問はほとんどそれをすべて言います。空の STL コンテナー (より正確にはstd::set) への参照を初期化する必要があります。

試行する:

typedef std::set<bozo *> bozo_set;
class BozoClass { public: BozoClass(): bozosetref(bozo_set()) {} }

次のようなコンパイラ エラーが発生します。

bozo.cc:104: error: invalid initialization of non-const reference of type ‘bozo_set&’ from a temporary of type ‘bozo_set’

(補足: これは、これを使用する必要があるかどうかを尋ねているわけtypedefではありません。それについてコメントを受け付けていますが、これは実際の質問ではありません。)

編集:これについて多くのコメントがあったため、これへの参照を持つポイントは、セットを管理するために大量bozoの不要なメソッドを含める代わりに、外部クラスがこのセットの要素を変更できるようにすることです。BozoClass

4

3 に答える 3

1
#include <set>

struct Class {
    Class() : set(), setref(set) {}

    std::set<void *> set;
    std::set<void *> &setref;
};
于 2013-07-05T14:53:15.070 に答える
1

あなたが抱えている問題は、実際にはコンパイラエラーによってよく説明されています:

タイプ「bozo_set」の一時からのタイプ「bozo_set&」の非定数参照の無効な初期化</p>

コンパイラは、一時的な参照を取得しようとしていることを伝えています。あなたが参照しているものは一時的であるため、これを行うことはできません* 。つまり、すぐに存在しなくなります。参照されている一時的なものは、bozo_setここで構築しているものです。

bozosetref(bozo_set())
           ^^^^^^^^^^

bozosetref(bozo_set())式の実行が終了するとすぐに、setインスタンス化された inbozo_set()は破棄されます。

おそらく、bozosetrefは 型のメンバー変数ですset<bozo*>&

あなたが参照しようとしているを所有することBozoClassを意図しているように思えます。それは問題ありませんが、通常は への参照を取得せず、直接インスタンス化するだけです。setset

class BozoClass 
{ 
public: 
  BozoClass() {}
private:
  set<bozo*> mBozos;
};

さて、mBozosは への参照ではなくsetsetそれ自体です。

BozoClass次に、アクセサーを介してクライアントへの参照を提供できます。

class BozoClass
{
public:
  // ...
  set<bozo*>& GetBozos() { return mBozos; }
};

クライアントは、setこのアクセサーを介して直接使用および変更できます。

int main()
{
  BozoClass bc;
  bc.GetBozos().insert (new bozo); // or something
}

  • 実際には、これを行うことはできますが、行うべきではありません。セット自体は変数に割り当てられていないため、それを「保持」するものは何もありません。あなたが取った参照は無効になります。
于 2013-07-05T15:18:39.767 に答える
0

非 const オブジェクトへの参照を渡すことはできません。
あなたの場合、そのようなことが許可されている場合、クラス内の既に削除された bozo_set の一時的なインスタンスへの参照を取得しますが、空のセットへの参照は取得しません。

于 2013-07-05T14:52:49.917 に答える