1

これが私の問題です。

オブジェクトの配列を (std::vector で) 保持するクラスがあります。これらのオブジェクトはクライアント コードから変更できるため、変更する必要があるオブジェクトへのポインターを返すプライベート ゲッターを作成しました。public メソッドは、この getter を使用して配列内のオブジェクトを変更します。

プライベート ゲッターは、配列内のオブジェクトの特定の値をクライアント コードに返す他のメンバー関数でも使用されます。これらの関数をconstにして返してほしいのですが、前述の非constゲッターを使っているのでできません。

もう 1 つの const ゲッターを作成できることはわかっていますが、それではコードが重複するだけです。

どうすればこれを正しく実装できますか?

コード例:

class Object;

class Inventory
{
    Object* GetObject(int id);
    void AddObjectProp(int id, int amount) {
        Object* x = GetObject id);
        x->prop += amount;
    }

    //using const here is not posible because GetObject is not const
    int GetObjectProp(int id) {
        Object* x = GetObject id);
        return x->prop;
    }    

}

ありがとうございました。

4

3 に答える 3

3

あなたがそれをしたくないと言っているのは知っていますが、最もクリーンな解決策は2つのゲッターを使用することです:

class Inventory
{
    Object* GetObject(int id);
    const Object* GetObject(int id) const;

    void AddObjectProp(int id, int amount) {
        Object* x = GetObject(id);
    }

    int GetObjectProp(int id) const {
        const Object* x = GetObject(id);
    }    
};

GetObject()実装を複製する限り、次のいずれかが可能です

  • ほとんどのコードを除外します。また
  • 一方のゲッターをもう一方の観点から実装します。
于 2013-01-24T16:18:28.103 に答える
2

私はあなたが作ることができると信じています

const Object* GetObject(int id) const;

次に、次のことができます。

int GetObjectProp(int id) const {
    const Object* x = GetObject(id);
    return x->prop;
}    

または:

int GetObjectProp(int id) const {
    return GetObject(id)->prop;
}    

(また、の「id」の前に欠落している括弧を修正しましたGetObject()

于 2013-01-24T16:18:03.403 に答える
0

ここでは、ダブルゲッターを使用することがコードの重複と見なされるとは思いません。どちらのゲッターにも独自のユース ケースがあります。

1 つの getter は、const 参照を必要とするクライアントが使用するように設計されています。

もう 1 つのゲッター (非 const 参照を探していることをコード内で明確にするために、アクセサーと呼びます) は、オブジェクトを変更する可能性があるすべてのクライアントが使用することを目的としています。

これは私のアプローチです:

class Inventory
{
   Object& accessObject(int id);
   const Object& getObject(int id) const;

   ...
};

本当に2つのゲッターを持ちたくないconst_cast場合は、必要に応じてconstnessをキャストするために使用できる単一のconstゲッターはどうですか?

于 2013-01-24T16:32:23.410 に答える