我们假设我们已经提供了以下功能:
class MyClass
{
MyClass(double var) {
this->var = var;
}
protected:
double var;
};
MyClass foo( MyClass1 obj) {
}
功能foo()
我们希望能够访问obj.var
。但是怎么样?
我们无法再次使用关键字double
,因此我们无法创建getter getVar()
更重要的是,我们无法将foo()
作为MyClass
的朋友
此外,foo()
不能成为一种方法。
答案 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();
}