我们假设我们已经给出了一个以下函数

We assume that we have given a following function

本文关键字:我们 一个以 函数 假设      更新时间:2023-10-16

我们假设我们给出了以下函数:

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

在功能foo()我们希望访问obj.var .但是怎么做呢?我们不能再次使用关键字double,所以我们不能创建getter getVar()更重要的是,我们不能让我们的函数foo()MyClass的朋友此外,foo()不能成为一种方法。

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;
}

不能从类外部访问类的受保护成员或任何派生对象。如果您不能直接更改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();
}