6

スタイルについて質問があります。外因性オブジェクトの値(金利)に依存するクラス(私の場合はオプション)があります。私の目標は、外因性オブジェクト(Rate)の抽象基本クラスを作成して、依存するクラスOption内で機能するSimulatedRateやConstantRateなどのバリエーションを作成できるようにすることです。

ただし、C ++で見つけたのは、明らかに抽象基本クラスをインスタンス化できないため、基本クラスへのポインターまたは参照のいずれかを格納する必要があるためです。私の懸念は、インスタンス化された外因性オブジェクトが依存クラスの外部のスコープから外れると、依存クラスがジャンクを指すようになることです。

C ++でこの問題にポリモーフィズムを利用する合理的な方法はありますか?

私の現在のコード:

class Dependent 
{
public:
    Dependent(const Exogenous& exo) : exo_(exo) {}
    double getSomething() const { exo_.interfaceMethod(); }
private:
    Exogenous& exo_;
}

class Exogenous
{
public:
    virtual double interfaceMethod() const=0;
}

class ExogenousVariationA
{
public:
    virtual double interfaceMethod() const { return resultA; }
}

class ExogenousVariationB
{
public:
    virtual double interfaceMethod() const { return resultB; }
}
4

2 に答える 2

5

あなたの心配は正しいです。クライアントから渡されたオブジェクトを参照に保存しているため、必要なときにそのクライアントがオブジェクトを存続させることを信頼しています。これにより、問題が発生しやすくなります。もちろん、動的に割り当てられたオブジェクトへの生のポインターを使用した場合も同様です。オブジェクトを使い終わる前にクライアントがdeleteそれを行うと、再び問題が発生します。

解決策は、オブジェクトの存続期間にわたって何らかの責任をクライアントに与えるよう強制することです。これを行う方法は、スマート ポインターを要求することです。問題によっては、std::unique_ptrまたはが必要になる場合がありますstd::shared_ptr。クライアントから所有権を取得する場合は前者を使用し、クライアントと所有権を共有する場合は後者を使用します。を選択したとしましょう。クラスを次のstd::unique_ptrように定義します。Dependent

class Dependent 
{
public:
    Dependent(std::unique_ptr<Exogenous> exo) : exo_(std::move(exo)) {}
    double getSomething() const { exo_->interfaceMethod(); }
private:
    std::unique_ptr<Exogenous> exo_;
}

クライアントはこれを次のように使用します。

std::unique_ptr<Exogenous> ptr(new ExogenousVariationA());
Dependent dep(std::move(ptr));

クライアントがstd::unique_ptrをあなたに渡すと、クライアントはオブジェクトの所有権をあなたに与えます。オブジェクトは、あなた std::unique_ptrが破壊されたときにのみ破壊されます (Dependentそれはメンバーであるため、あなたが破壊されたときです)。

または、 を取得するstd::shared_ptrと、クライアントの とあなたstd::shared_ptrの の両方が破棄されると、オブジェクトは破棄されます。

于 2013-03-05T01:00:20.200 に答える
3

sftrabbitにはいくつかの良いアドバイスがあり、それに次のように追加します。

  • virtual clone()抽象基本クラスでメソッドを作成できます(仮想基本クラスではありません-それはまったく別のものです)。そのメソッドは、派生した金利クラスに実装され、オプションが所有できる新しい独立した金利オブジェクトへのポインタを返します。これは、オブジェクトに使用時に変化するデータが含まれている場合(計算やキャッシュなど)に特に役立ちます。
  • おそらくこれは望ましくありませんが、std / boost共有ポインタを使用すると、共有オブジェクトへの弱いポインタを要求することもできます...そうすれば、オブジェクトの「所有者」(含まれない)かどうかをテストできます。あなた)すでにそれを終えて、その破壊を引き起こしました

これとは別に、ランタイムポリモーフィズムを使用するには、クラスExogenousVariationAと〜Bクラスが実際にから派生してExogenousいる必要があり、ポリモーフィックにディスパッチするメソッドは。である必要がありますvirtual。これは次のようになります。

class Exogenous
{
public:
    virtual double interfaceMethod() const=0;
}

class ExogenousVariationA : public Exogenous
{
public:
    double interfaceMethod() const { return resultA; }
}
于 2013-03-05T02:07:55.137 に答える