1

こんにちは、Joshi の C++ Design Patterns and Derivatives Pricing の第 4 章を読んでいますが、コードの一部がわかりません。クラス PayOff があり、メンバーとして PayOff を持つクラス VanillaOption を定義したいと考えています。これを効果的に行うために、彼はバーチャル コピー コンストラクターを使用します。

#ifndef PAYOFF_H
#define PAYOFF_H

class PayOff
{
private:
public:
    PayOff(){}
    virtual double operator() (double Spot) const = 0;
    virtual PayOff* clone() = 0;
    virtual ~PayOff(){}
};

class PayOffCall : public PayOff
{
private:
    double Strike;
public:
    PayOffCall(double Strike_);
    virtual PayOff* clone(){return new PayOffCall(*this);}
    virtual ~PayOffCall(){}
};
#endif 



#ifndef VO_H
#define VO_H
#include "PayOff.h"

class VanillaOption
{
private:
PayOff* ThePayOffPtr;               
double Expiry;
public:
VanillaOption(PayOff&,double );     //constructor
VanillaOption(VanillaOption& original) {thePayOffPtr = original.thePayOffPtr->clone(); Expiry = original.Expiry;}       //copy constructor
VanillaOption& operator=(VanillaOption&);       

~VanillaOption();
 };





#endif

VanillaOption のコピー コンストラクターがオリジナルのプライベート メンバーにアクセスする方法を理解していません。つまり、なぜ thePayOffPtr = original.thePayOffPtr->clone(); 有効期限 = original.Expiry;。誰でもこれを手伝ってもらえますか?よろしくお願いします。

4

3 に答える 3

8

アクセス制御は、インスタンスではなく、クラス全体に適用されます。クラスのメソッドは、クラスの他のオブジェクトであっても、そのクラスで定義されたプライベート メンバーにアクセスできます。コンストラクターは別のオブジェクト ( ) で実行されますが、コンストラクターはプライベート メンバーが定義されているクラスの一部であるため、this != &originalプライベート メンバーにアクセスできます。original

覚えておいてください: メソッドとコンストラクターは、インスタンスではなく、クラス自体に属します!

于 2012-10-17T18:07:22.870 に答える
1

これを考える方法は、クラスがそれ自身のプライベート パーツにアクセスできるということです。それができない場合は、コピーの作成などを容易にするために実装を公開するメソッドを作成する必要があり、これによりカプセル化が損なわれます。

于 2012-10-17T18:44:21.027 に答える
0

クラスのコーディング中に、他のクラスのメンバー (インスタント変数またはメソッド) にアクセスする必要がある場合は、それらがパブリックである必要があります。クラスのパブリック メンバーは、そのクラスへのオブジェクトを作成することにより、任意のクラスからアクセスできます。 .getter メソッドと setter メソッドは、これを理解するための良い例です。通常、インスタント変数はプライベートに宣言され、メソッドはパブリックに宣言されます。したがって、これらのメソッドを使用してインスタント変数にアクセスすることはできますが、直接にはアクセスできません。

于 2012-10-17T18:17:38.107 に答える