我们假设我们已经给出了以下功能

时间:2014-04-01 15:24:29

标签: c++

我们假设我们已经提供了以下功能:

class MyClass
{
    MyClass(double var) {
        this->var = var;
    }
protected:
    double var;
};

MyClass foo( MyClass1 obj) {
}

功能foo()我们希望能够访问obj.var。但是怎么样? 我们无法再次使用关键字double,因此我们无法创建getter getVar() 更重要的是,我们无法将foo()作为MyClass的朋友 此外,foo()不能成为一种方法。

2 个答案:

答案 0 :(得分:1)

Makr MyClass1 MyClass的子类,并通过成员函数提供对MyClass::var的公共访问权限:

MyClass1 : public MyClass
{
 public:
  auto v()->decltype((var)) // returns a reference to var
  { 
    return var; 
  }
};

然后

MyClass foo( MyClass1 obj) {
  obj.v()++; // increments var
  return obj;
}

请注意,这要求MyClass::MyClass(double)构造函数是非私有的。

另一种方法是在派生类中使var公开。但如果你发现自己在实际代码中这样做,你必须停下来问自己一些问题:

MyClass1 : public MyClass
{
 public:
  using MyClass::var; // look! var is now public
};

MyClass foo( MyClass1 obj) {
  obj.var++; // increments var
  return obj;
}

答案 1 :(得分:0)

您无法从类外部或任何派生对象访问类的受保护成员。 如果您无法直接更改MyClass但想要访问protected值,则可以使用您定义getter的其他类型继承该值。

class MyClass
{
public:
  MyClass(double var) : member_var(var) {}
protected:
  double member_var;
};
class OtherClass : public MyClass
{
public:
  OtherClass(double var) : MyClass(var) {}
  double get_member(void) const { return member_var;  }
};

您可以将派生类用于foo

OtherClass foo(OtherClass obj)
{
  double x = 5.0 + obj.get_member();
}