如果我有课:
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"是私人的。
答案 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_;
};