访问私有变量对象

时间:2014-12-19 00:14:05

标签: c++ class object setter getter

如果我有课:

class A {
public:
    A();
   ~A();

    int something();
}

class B {
public:
    B() {a = new A();};
   ~B();
private:
     A *a;
}

main() {
   B x;
}

是使用对象的唯一方法" a"主要是为了吸气吗?

class B {
public: 
    A getA() {return *a;};
private:
    A *a;
}

然后,如果我想设置私有变量对象,我需要一个setter,并在main中设置它?

编辑:我更新了A,B级,主要一点。主要问题是,如果我在main中创建B的对象,最好的方法是什么。我可以访问函数" something()"无论如何,所以信息可以存储在私人变量" a"?我知道我不能做x.a.something()因为" a"是私人的。

1 个答案:

答案 0 :(得分:2)

  

"是使用对象的唯一方法" a"主要是为了吸气吗?"

  

"然后如果我想设置私有变量对象,我需要一个setter,并在main中设置它?"

答案是:是的。

创建类成员变量private的目的是将数据封装到类中,并且通过使用此类的函数成员使访问变得可行。最简单的函数成员是 getter setter 成员函数。
对于一个天真的观点来看,它们似乎毫无用处(至少你可以简单地使用public类成员变量)。但是封装意味着你不需要改变任何东西,如果事后证明,你可以例如需要调查为该成员设置新值,可能需要触发重新计算或对其他类成员变量的任何操作。


您的课程声明应如下所示(您通常不需要使用A*指针)

class A {
};

class B {
public:
    B() : a_() {}
    const A& a() const { return a_; } // Getter
    void a(const A& newValue) { a_ = newValue; } // Setter
private:
     A a_;
};

并使用它

int main() {
    A a;
    B x;

    x.a(a); // Set the value
    a = x.a(); // Get the value
}

扩展您的修改:

  

"我是否可以以任何方式访问函数something(),以便将信息存储在私有变量a中?我知道我无法x.a.something()因为a是私有的。"

您无法直接从经典 getter 函数(如上所述)访问该函数,例如

x.a().something();

因为something()不是const类的A成员函数。

为了允许操作,您需要声明getter返回非const引用(实际上会破坏提到的封装规则,因此不鼓励):

    A& a() { return a_; } // Getter

或在类B中提供成员函数,该函数正确委托该调用:

class B {
public:
    // like all of my proposal from above ...

    int doSomething() {
       return a_.something();
    }
private:
     A a_;
};