2

オブジェクトへのポインターを返す関数があります。このような:

class SomeClass
{
public:
    Object* getObject() const { return &obj; };
private:
    Object obj;
}

問題は、返されたオブジェクトを変更する呼び出し関数を使用しないことです。内部で操作する関数を呼び出す可能性がありますが、SomeClass 内のobjを変更しないでください...例は理解しやすいかもしれません:

-関数がconstオブジェクトへのポインタを返す場合const Object* getObject() const、呼び出し元の関数はオブジェクトの非constメソッドを使用できません(ただし、できるようにしたいです)。

-単純にポインターを返すと、呼び出し元の関数がオブジェクトを変更する可能性があります。

Object* pointer = sclass.getObject();
*pointer = Object();

そのため、 sclass内のオブジェクトは別のオブジェクトになりました (これは望ましくありません)。

回避策はありますか?

4

4 に答える 4

1

他のいくつかが上で指摘したように、オブジェクトAPIがconstの正当性を強制しない場合、クライアント関数がそれを変更するのを防ぐことはできません。これまでのところ、理想的なオブジェクト指向設計です。

唯一の回避策(私は自分ではしません)は、getObject()メソッド内からオブジェクトのコピーを返すことです。

Object* getObject() const { Object* o = new o(obj); return o; };

ただし、これには、削除などを処理する必要があるなどの不要な問題が伴います。ただし、元のobj変数が変更されないという要件と一致します。

于 2012-06-11T15:26:13.530 に答える
0

Objectクラスの実装を制御できる場合は、ケーキを食べて食べることもできることに気付きました。

あなたの特定の例では、代入演算子(operator=())が無効になってObjectいる場合、式

*pointer = Object();

無効になります。

: もちろん、この決定の影響は単に: コードの他の部分でs のインスタンスを相互SomeClass::getObject()に割り当てることができなくなるだけではありません。Objectこの制限があなたにとって価値があるかどうかを判断する必要があります

: を無効operator=にするには、次のように宣言しますprivate(実装は必要ありません)。

class Object
{
  // ... current member declarations/definitions
  private:
    Object& operator=(const Object&); // no implementation
};
于 2012-06-12T00:51:52.560 に答える