2011-12-22 130 views
0
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的理解> 有最简单的方法来处理数据,我们不需要显式分配资源和释放资源。 唯一值得关注的是它可能涉及不必要的副本。但是,如果我总是使用通过引用,这应该不成问题。

我给方法2> 该方法已在FMOD库(http://www.fmod.org/)中广泛使用,所以它必须具有其边缘的理解。但我们必须手动分配和释放资源。

我的方法的理解3> 它消除了手动释放分配的资源要求,但它涉及的开销相比,方法2

那么,哪些方法应该笔者在实践中,当使用?

+0

的[C++?:当使用指针]可能重复(http://stackoverflow.com/questions/658133/c-when-to-use-pointers) – 2011-12-22 15:33:05

+0

我知道规则时使用指针/参考,但这是一个不同的问题。 – q0987 2011-12-22 22:02:04

回答

0

你为什么不把结构体作为构造函数的参数?

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

如果您正在编写C++代码,为什么使用'printf'? – 2011-12-22 15:38:07

+1

我比std :: cout更喜欢printf的语法。 – 2011-12-22 15:40:49

0

考虑将const引用传递给构造函数(假设它在构造期间不修改原始结构)。

StructB::StructB(const StructA &myobject) 
{ 
    sa = myobject; 
} 

这将涉及到只有一个副本操作,这是分配(从而避免参数传递过程中复制)

如果你想完全避免复印时,则指针是你的答案。只需传递指针作为参数(StructA *结构体) - 但是,您有一个管理分配的堆内存的问题(需要调用新的StructA并删除)。要么使用智能指针来解决这个问题,要么手动管理内存 - 太多的方法去做:)

让我知道如果你有问题!

0

如果这只是一个参考,那么你可以使用一个引用成员并在ctor期间实例化它。

StructB{ 
StructB(const StructA & myobj) : sa(&myobj){} 
StructA &sa; 
}; 

相信sharedptr将试图摧毁对象时StructB超出范围所以这可能是如果你正在使用的原始实例规划这个对象超出范围后,一个坏主意。这应该会引发异常,特别是如果您已经在堆栈中声明了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){}; 
}; 
相关问题