2012-02-10 11 views
0

我有两个构造函数用于一个对象,它们使用两组不同的数据。根据可用参数使用一个或另一个重载创建者

myclass myobject(set 1); 
myclass myobject(set 2); 

set 1set 2是不同类型的。

我想创建一个叫做myobject的myclass对象,它既可以带有构造函数1也可以带有构造函数2,这取决于此时可用的参数集,然后在if语句之外使用myobject。

if(set1) 
    myclass myobject(set 1); 
else 
    myclass myobject(set 2); 
myobject.operation(); 

有谁能告诉我这么做的好方法吗?

+0

“set 1”是什么意思?这是不正确的c + +语法,是那些相同类型的不同变量?不同的类型?不兼容的类型?模糊的转换序列?你尝试了什么,并得到一个错误?什么错误? – PlasmaHH 2012-02-10 10:46:59

回答

4

如果默认的构造和拷贝(或移动)的分配很便宜,只需使用:

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(); 

如果你必须将它分配给堆栈,除了使用新的位置(或者改变构造函数来接受两种可能性)之外,我还是没有看到。

#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 
+0

你是什么意思“足够短”?我试过这个:'myclass myobject(set1?(argument1,argument2):(argument3));'但是得到错误:'错误:没有匹配函数调用'myclass :: myclass(int)''(set1是一个布尔)。 – Geoffroy 2012-02-10 10:35:17

+0

我认为OP意味着'myclass'有两个不同的构造函数,具有不同的参数。 – 2012-02-10 10:35:19

+0

@Geoffroy:好的。检查更新。 – kennytm 2012-02-10 10:47:59

1

这是在需要使用动态分配的情况下,一个,优选具有智能指针,以保持自动存储处理:

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

相关问题