构造和传递结构的结构作为函数参数的有效方法
efficient way to construct and pass structure of structure as a function parameter
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相比,它涉及开销。
那么我应该在实践中使用哪种方法,什么时候使用?
为什么不直接将结构体作为构造函数的参数呢?
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";
}
};
考虑将const引用传递给构造函数(假设它在构造过程中没有修改原始结构)。
StructB::StructB(const StructA &myobject)
{
sa = myobject;
}
这将只涉及一次复制操作,这是在赋值期间(从而避免在参数传递期间复制)
如果你想完全避免复制,那么指针就是你的答案。简单地传递指针作为参数(StructA *结构)-但是你有一个管理分配的堆内存的问题(必须调用新的StructA和删除)。要么使用智能指针来解决这个问题,要么手动管理内存——有太多方法可以做到:)
如果你有问题请告诉我!
如果这只是一个引用,那么你可以使用引用成员并在actor中实例化它。
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 ){};
};
相关文章:
- 使用不带参数的函数访问结构元素
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 链表,反向函数,数据结构
- 结构向量中自定义结构函数的内存使用
- C++ 中的嵌套结构函数
- 在结构函数之间传递文件路径 C++ 编辑:修复LNK2019错误
- 如何将值从外部传递到结构函数
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- C++结构函数的多个定义
- C++ 另一个标头中的结构函数给出"missing type specifier"
- 如何在C中找到结构/函数的父头文件
- C++二进制文件到结构函数
- C++ 将结构函数作为继承结构中函数的参数传递
- 如何在 main 之外的类中使用结构函数
- 在类中使用结构函数,在基类 c++ 中使用变量
- C++ 结构函数体调用另一个结构函数,同一个模块
- 是存储在对象中的类/结构函数
- Eclipse CDT 在从 std::map 访问时无法解析结构函数
- C++模板自身名称作为模板模板参数在同一模板结构函数内传递
- 如何使用真正的字符串类型来表示类结构函数中的字符串