struct StructA
{
int i;
int j;
};
// Method 1
struct StructBA
{
int k;
StructA sa;
}
// Method 2
struct StructCA
{
int m;
StructA *psa;
};
// Method 3
struct StructDA
{
int n;
boost::shared_ptr<StructA> psa;
};
基本上,我需要将包含其他结构的结构作为函数参数传递给类的构造函数。 在这种情况下最好的设计实践是什么?
注意:如果不正确,请纠正我的理解。
我对方法1的理解&gt; 有最简单的方法来处理数据,我们不需要显式分配资源和释放资源。 唯一的问题是它可能涉及不必要的副本。但是,如果我总是使用传递引用,这应该不是问题。
我对方法2的理解&gt; 这种方法已广泛应用于FMOD库(http://www.fmod.org/),因此它必须具有优势。但我们必须手动分配和释放资源。
我对方法3的理解&gt; 它消除了手动释放已分配资源的要求,但与方法2相比,它涉及开销。
那么我应该在实践中使用哪种方法?何时?
答案 0 :(得分:0)
为什么不将struct作为构造函数的参数?
struct StructA //original struct
{
int i;
int j;
};
struct StructB
{
StructB(StructA& ref){ //Just struct
std::cout<<"i: "<<ref.i<<", j:"<<ref.j<<"\n";
}
StructB(StructA& ref, int param){ //Struct and parameter
std::cout<<"i: "<<ref.i<<", j: "<<ref.j<<", parameter: "<<param<<"\n";
}
};
答案 1 :(得分:0)
考虑将const引用传递给构造函数(假设它在构造期间不修改原始结构)。
StructB::StructB(const StructA &myobject)
{
sa = myobject;
}
这将只涉及一个复制操作,即在赋值期间(从而避免在参数传递期间复制)
如果您想完全避免复制,那么指针就是您的答案。只需将指针作为参数传递(StructA *结构) - 但是你有一个管理分配的堆内存的问题(必须调用新的StructA和删除)。要么使用智能指针来解决这个问题,要么手动管理内存 - 有很多方法可以做到这一点:)
如果您有任何疑问,请告诉我们。
答案 2 :(得分:0)
如果这只是一个引用,那么你可以使用引用成员并在ctor期间实例化它。
StructB{
StructB(const StructA & myobj) : sa( &myobj ){}
StructA &sa;
};
我相信当structB超出范围时,sharedptr会尝试销毁该对象,因此如果您计划在此对象超出范围后使用原始实例,这可能是一个坏主意。这应该抛出一个异常,特别是如果你已经在堆栈上声明了StructA而不是堆。您的另一个选择是使StructA成为一个可移动的对象,然后通过赋值获得所有权。
StructA{
StructA( StructA && toMove ){ *this = std::move( toMove ); };
StructA & opertor=( StructA && toMove ) { //swap this and toMove };
};
StructB{
StructB( StructA && toMove ) : sa( std::move( toMove ){};
};