【发布时间】:2016-06-03 02:28:52
【问题描述】:
我正在尝试理解使用 c++ 进行的面向对象编程。下面是一个最小的例子,它的结果不是我天真期望的:
#include <iostream>
class B {
public:
B (int val) : val(val) {;}
int get_val() { return val; }
int set_val(int a) { val = a; }
private:
int val;
};
class A {
public:
A (B b) : b(b) {;}
B get_b() { return b; }
private:
B b;
};
int main(){
B b_main(5);
std::cout << b_main.get_val() << std::endl; // Prints 5, which makes sense
A a_main(b_main);
std::cout << a_main.get_b().get_val() << std::endl; // Prints 5, which makes sense
a_main.get_b().set_val(2);
std::cout << a_main.get_b().get_val() << std::endl; // Why does this not print 2?
return 0;
}
最后一个 cout 语句对我来说没有意义。在倒数第二行中,我将对象的值设置为 2,为什么不打印 2?查看 Stack Exchange 上的一些类似问题,我发现了一些建议让 A 和 B 成为彼此的朋友。我尝试在 B 类中添加 friend class A,在 A 类中添加 friend class B,但这不起作用。在我的理解中,添加朋友语句应该是不必要的,因为我在 A 类中有 get_b() 方法。我找到了一些建议,尝试通过引用 A 的构造函数来传递 B 类型的对象:A (B& b) : b(b) {;} 但这确实也不行。
谁能向我解释为什么程序没有产生预期的结果以及如何获得预期的结果(即最后一个 cout 语句打印 2)?
注意:我还尝试了以下方法。我将 A 类的私有变量 b 设为 public:
#include <iostream>
class B {
public:
B (int val) : val(val) {;}
int get_val() { return val; }
int set_val(int a) { val = a; }
private:
int val;
};
class A {
public:
A (B b) : b(b) {;}
B b; // This is now public
//B get_b() { return b; } // This is no longer needed
private:
};
int main(){
B bmain(5);
std::cout << bmain.get_val() << std::endl;
A amain(bmain);
std::cout << amain.b.get_val() << std::endl;
amain.b.set_val(2);
std::cout << amain.b.get_val() << std::endl; // Works!
return 0;
}
现在我得到了想要的结果。与第一个代码 sn-p 相比,这是应该如何实现代码的吗?我想在第一个代码 sn-p 中使用get_b() 方法,但如果这不是解决此问题的正确方法,请告诉我。
【问题讨论】: