构造和传递结构结构作为函数参数的有效方法

时间:2011-12-22 15:25:07

标签: c++

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相比,它涉及开销。

那么我应该在实践中使用哪种方法?何时?

3 个答案:

答案 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 ){};
};