以下是一个示例:

在circle.h中

class circle
{
    double _radius;
public:
    double getRadius() {return _radius;}
    void setRadius(double r) {_radius=r;}
}

在主
int main()
{
    circle a;
    cout<<a.getRadius();    // I want to use "a.radius"
    a.setRadius(3.2);       // I want to use "a.radius=3.2"
}

那么第一个问题是为什么我们应该使用get和set函数访问实例变量而不是直接访问它们?第二个问题是如何使运算符重载以使get和set函数调用看起来简洁(就像Objective-C所做的那样)?

最佳答案

当然,使您希望使用的语法最简单的方法是使_radius成为名为radius的公共(public)成员:

class circle
{
public:
    double radius;
}

现在,您可以像这样使用它:
circle c;
c.radius = 10.0;

但是,您不应该仅根据想要编写代码的方式(或如何使用C#编写代码)做出此类决定。我建议您为每个成员考虑以下几点:
  • 直接设置成员是否有意义?成员可能只是对象状态的私有(private)部分,并受其他成员功能的影响。考虑以下示例,您真正想要公开的接口(interface)只是一个增加circle大小的函数:
    class circle
    {
    public:
        circle(double radius, double delta = 1.0)
          : radius(radius), delta(delta) { }
    
        double increaseSize() {
          radius += delta;
          return radius;
        }
    private:
        double radius;
        double delta;
    }
    
  • 是否需要强制执行不变式?考虑一下,也许您已经确定不可能存在半径为负的circle这样的东西。您可能希望通过具有一个成员函数来执行此操作,该成员函数会检查给定的新半径以确保其大于0。
  • 是否要通过界面提供成员的某些不同表示形式?也许您希望circle作为成员保持其半径,但是任何客户唯一想知道的就是它的面积。您可以将radius设为私有(private),然后提供getArea函数,如下所示:
    class circle
    {
    public:
        circle(double radius)
          : radius(radius) { }
    
        double getArea() {
          return PI * radius * radius;
        }
    private:
        double radius;
    }
    
  • 目前,以上几点均可能不适用,但将来可能会适用。如果您具有这种远见,那么最好现在提供getter和setter函数。这样可以确保客户端使用的界面以后不会更改。

  • 作为您的getter和setter的另一种命名方案,很简单,有两个重载函数-一个用于设置,另一个用于-像这样:
    class circle
    {
    public:
        void radius(double); // Set the radius
        double radius();     // Get the radius
    private:
        double radius;
    }
    

    关于c++ - 如何在C++中访问Objective-C的getter和setter之类的实例变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15902474/

    10-08 21:33