根据可用的参数使用一个或另一个重载的创建者
Using one or the other overloaded creator depending on the arguments available
我有两个对象的构造函数,它们使用两组不同的数据。
myclass myobject(set 1);
myclass myobject(set 2);
CCD_ 1和CCD_。
我想创建一个名为myobject的myclass对象,根据此时可用的参数集,使用构造函数1或构造函数2,然后在if语句之外使用myobject。
if(set1)
myclass myobject(set 1);
else
myclass myobject(set 2);
myobject.operation();
有人能告诉我做这件事的好方法吗?
如果默认构造和复制(或移动)赋值很便宜,只需使用:
myclass myobject;
if (set1)
myobject = myclass(1, 2);
else
myobject = myclass(3);
myobject.operation();
如果在堆上分配东西是可以接受的,那么使用一个指针:
std::unique_ptr<myclass> myobject;
// const std::auto_ptr<myclass> in C++03 (it's fine as long as you keep it unique)
if (set1)
myobject.reset(new myclass(1, 2));
else
myobject.reset(new myclass(3));
myobject->operation();
若您必须在堆栈上分配它,除了使用placementnew(或者更改构造函数以接受这两种可能性)之外,我看不到任何其他方法。
#include <new>
char myobject_buffer[sizeof(myclass)];
myclass* ptr;
if (set1)
ptr = new (myobject_buffer) myclass(1, 2);
else
ptr = new (myobject_buffer) myclass(3);
ptr->operation();
...
ptr->~myclass(); // <-- use RAII to call this for exception safety
这是需要使用动态分配的情况之一,最好使用智能指针来保持自动内存处理:
std::unique_ptr<myclass> pmyobject;
if (set1)
{
pmyobject.reset(new myclass(arg1, arg2));
}
else
{
pmyobject.reset(new myclass(arg3));
}
pmyobject->operation();
std::unique_ptr
是C++11的一个特性,但您可以将其替换为boost::scoped_ptr
(这不是完全等效的,但已经足够接近了)。
您也可以使用Boost.Optional,它可以处理这种延迟初始化。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何在C++中将函数发送到另一个进程
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口