我有两个班,A班和B班,
class A {
public:
A(B b);
B GetB();
private:
B b;
};
class B {
public:
B();
void IncrementCounter();
int GetCounter();
private:
int counter = 0;
};
我想把类型B的对象传递给类A的构造函数,然后把类B的示例保存在类A示例中,把类B示例作为参数传递的最好方法是什么,把类B示例保存在类A示例中的最好方法是什么。
注意:我不想创建类B示例的副本,我希望A.getB().GetCounter始终与b.GetCounter()相同。
int main(){
B b;
A a(b);
b.IncrementCounter();
a.getB().IncrementCounter();
// then b.GetCounter() is same as a.getB().GetCounter() and both = 2
}
我看到人们使用指针/智能指针和引用/std:reference_wrapper,有什么区别?
2条答案
按热度按时间nukf8bse1#
如果不需要副本,请使用std::shared_ptr,例如:我假设您熟悉引用、常量引用和常量成员函数。
dzjeubhm2#
注意:我不想创建类
B
示例的副本,我希望A.getB().GetCounter()
总是与b.GetCounter()
相同。然后,您需要让
A
存储B&
引用,而不是B
对象示例,例如:只要
B
对象比A
对象活得长(在您的示例中确实如此),就不会有问题,不需要(共享)指针。但是,由于您在
B
之前声明了A
,因此您根本无法在A
中使用B
,因为编译器在解析A
时不知道B
是什么。由于
B
不依赖于A
,因此您可以简单地交换它们声明的顺序,例如:否则,如果您的情况不适合这样做,则必须在声明
A
之前使用B
的前向声明,例如:前向声明仅在处理引用和指针时有效,而在处理示例时无效。