【问题标题】:C++ access to private membersC++ 访问私有成员
【发布时间】:2012-10-17 18:04:46
【问题描述】:

您好,我正在阅读 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 的复制构造函数如何访问 original 的私有成员,即为什么我可以这样做 thePayOffPtr = original.thePayOffPtr->clone();和到期=原始。到期;。有人可以帮忙吗?非常感谢。

【问题讨论】:

    标签: c++


    【解决方案1】:

    访问控制适用于整个类,而不是实例。一个类的方法可以访问该类中定义的私有成员,甚至在该类的其他对象上。即使构造函数在不同的对象 (this != &original) 上运行,您仍然可以访问 original 的私有成员,因为构造函数是定义私有成员的类的一部分。

    记住:方法和构造函数属于类本身,而不是实例!

    【讨论】:

    • 你说“方法和构造函数属于类本身而不属于实例”是什么意思。你能扩展一下吗?非常感谢!
    • 方法是类的成员,而不是实例的成员。唯一真正属于实例的是非静态数据字段。唯一区分不同实例上的方法调用的是隐式this 指针指向不同的对象。访问控制检查是静态执行的;如果您在 A 类中的方法中,并且该方法访问 A 的私有成员,访问哪个实例的成员并不重要
    【解决方案2】:

    考虑它的方式是一个类可以访问它自己的私有部分。如果不能,那么您必须编写方法来公开实现,以方便复制构造之类的事情,这会损害封装。

    【讨论】:

      【解决方案3】:

      在为一个类编码时,如果你需要访问其他类的成员(即时变量或方法),它们必须是公共的。类的公共成员可以通过创建对象从任何类访问对于那个class.getter和setter方法是理解这一点的好例子。通常即时变量被声明为私有,而方法被声明为公共。所以我们只能使用这些方法来访问即时变量而不是直接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-23
        • 1970-01-01
        • 2012-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多