私は抽象度がclass AbstractClass
です。すべての派生クラスにはconst std::vector
があるはずですが、このフィールドは派生クラスclass
(型付き)に関連付けられています。インスタンスではありません。したがって、それをstatic
とすることは素晴らしいことです。もちろん、私はそれを基底クラスで定義することはできません。将来的に追加できる派生クラスごとにこれを実装することはできません。純粋仮想メソッドがconst参照を返す
新しい派生クラスを定義する誰かがstatic
として実装することを願っています。 (そうでなければ、プログラムは正常に動作するはずですが、不要なメモリ占有があります....)。
だから私は、この変数を返す純粋vitual
方法があります:私は、派生クラスの存在
virtual const std::vector<SomeType>& getVec() const = 0;
は次のように定義されています
class DerivedClass : public AbstractClass
{
public:
const std::vector<SomeType>& getVec() const { return vec; }
private:
static const std::vector<SomeType> Vec;
}
私はこれが安全やろうと、私は他のその可能性を考えますプログラマは新しい派生クラスを追加し、別の方法で実装することができます。 例:
const std::vector<SomeType>& getVec() const { return std::vector<SomeType>{ arg1, arg2}; }
私はコピーを避けたいので返された型をconst reference
と定義しました(Vec
がクラスのメンバーの場合)...このメソッドを公開するのは大丈夫ですか安全ですか?返品に危険がありますかconst reference
?
スタック変数へのポインタ/参照を返すことは、単独のバグです。 IMO、それはインターフェイスを設計することとは関係ありません。 – erenon
クラスは、a)データと、b)データを使用するコードとをグループ化するために使用されます。 'getters'は設計上の誤りの明確な証拠です...自分自身に尋ねます。なぜこれらの派生クラスのベクトルがありますか?そのベクトルを使っているコードはどこかにありますか?データ? –
Martin Fowlerの "TellDontAsk"も参照してください(この場合、Derivedクラスに...) –