根据可用的参数使用一个或另一个重载的创建者

Using one or the other overloaded creator depending on the arguments available

本文关键字:一个 另一个 创建者 重载 参数      更新时间:2023-10-16

我有两个对象的构造函数,它们使用两组不同的数据。

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,它可以处理这种延迟初始化。

相关文章: