C++初始化包含另一个对象设计问题的对象
C++ initializing an object that contains another object design issue
我正在尝试编写两个类A
和B
,其中B
包含类A
的实例。实际上,A
包含一些大数据。在这个玩具示例中,让我们假设它们如下所示:
class A{
public:
int a;
A(){}
A(const A& ac){
cout <<"copy constructor for A" << endl;
a = ac.a;
}
virtual ~A(){}
A& operator=(const A& that){
cout <<"operator = for A" << endl;
a = that.a;
return *this;
}
};
class B{
private:
A ba;
public:
B(){ a = A(); }
B(A& a){
cout << "Using default constructor" << endl;
ba = a;
}
B(const B& copy){
cout<<"copy"<< endl; ba = copy.ba;
}
B& operator=( const B& that){
cout<<"invoking operator = "<< k<< endl;
ba = that.ba;
return *this;
}
virtual ~B(){}
A& getA(){ return ba; }
void printAadrr(){
cout << &ba <<" "<< ba.a<< endl;
}
};
这样做的问题是,当使用B::B(A& a)
初始化B
时,参数被复制到实例中,ba
B
中。如果a
很大,则可能效率低下。
我想到了另一种方法,而不是
class B{
private:
A ba;
....
我能做到
class B{
private:
A* ba;
public:
B(){
ba = new A(); //but we have to free memory in destructor if we call default constructor
}
B(A& a){
cout << "Using default constructor" << endl;
ba = &a;
}
但是这种设计选择有其自身的问题,如果我默认构造函数B
,我需要释放稍后在析构函数中分配给ba
的内存。
如果我们使用B::B(A& a)
,是否有一种方便的方法可以将对象A
(在B
之外创建)的"引用"传递到构造函数中的B
中,如果我们使用 B::B(),则创建一个空的默认A
对象?我试过了
B::B(A& a){
&ba = &a;
}
但它给出了"左值必须在分配的左侧"错误。
任何建议不胜感激。对不起,帖子太长了。
使用移动语义定义构造函数,如下所示:
B::B( A && a )
: ba( std::move( a ) )
{}
现在,您可以将实例传输到对象中。
A a;
B b( std::move( a ) );
// `b` stores content of `a`, and local `a` is no longer valid.
如果需要,您仍然可以使用复制构造函数进行构造。
A a;
B b( a );
// `b` stores a copy of `a`, and local `a` is still valid.
不要将 A 作为简单的成员 var,而是有一个指向 A 的指针。然后在构造 B 时,只需传递指向 A 实例的指针。
class B{
private:
A* ba;
这取决于你的设计。如果您想B
自己的A
请使用std::move
通过B
获得A
。
在一般情况下,使用std::shared_ptr
它将自行管理内存。销毁std::shared_ptr<A>
的所有实例后,A
数据也将被删除。但在这种情况下,B
实例可以共享相同的A
数据。
其他解决方案是std::unique_ptr
但每次复制时都必须移动它B
这意味着A
的所有权将与std::move
解决方案一样转移。
相关文章:
- 在CToolBar对象中使用PNG时出现问题
- 将父类对象强制转换为子类的问题
- 类对象数组的问题会导致崩溃
- 在C++中遇到对象和类问题
- 在 Android Studio 中使用 C++ 共享对象时出现问题
- 在C ++ ASIO中,如何为HTTP或HTTPS创建相同的套接字对象(接口/抽象问题?
- 由于缺少类模板,NVCC 编译面向对象代码时出现问题
- C++删除/(递归)对象销毁问题
- C++ - 面试问题中的堆栈上的对象
- 将四元数旋转的游戏对象旋转另一个四元数时出现问题
- 通过 COM 对象连接 x64 应用程序时出现问题
- 擦除矢量问题矢量中的对象
- 将任意对象附加到数组有什么问题
- 在C++中将类实例添加到对象层次结构中的问题
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- C++ 迭代后销毁对象的问题
- "Extern"对象问题:错误:Id 返回 1 个退出状态
- 将文件从 iOS 应用程序加载到 C++ 对象中/<iostream>iOS 上的问题
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- 与 32 位共享对象的链接问题