通过引用退出函数,没有默认构造函数的类型的对象

时间:2013-02-21 14:09:18

标签: c++ pointers c++11 unique-ptr

例如

bool read(Input &input);

Input input; //error
bool success = read(input);

将是一个错误,因为Input没有默认构造函数。

在这种情况下,我是否可以使用任何技巧将Input对象从函数中移除?我想我必须有一些unique_ptr技巧,但我不确定如何。随意建议其他方法。

请举例说明读取功能的外观。

我不想为此目的而为Input创建一个(无意义的)默认构造函数,并注意这只是一个愚蠢的例子,所以不要在“Input”,“read”这两个词上附加任何特殊含义,等:))

4 个答案:

答案 0 :(得分:1)

bool read(unique_ptr<Input> &input)  // read asume input is disposable/empty
{    ....
  input.reset(new Input( a,d,c ) );
     ....
 }

....
unique_ptr<Input> input;      //error ?
bool success = read(input);
if (input)
  if (succes)
     input->X();
  else
     input->Y();

答案 1 :(得分:0)

从评论中看来,您的问题似乎是设计一个

的功能
  • 可能会失败(如果是这样,应该向来电者发出信号),

  • 但如果没有,则生成没有默认cconstructor的类型的值

第一点很简单:使用例外。

第二点也很简单:使用函数返回值功能。

即,

Object foo()
{
    if( "didna wrok" )
    {
        throw std::runtime_error( "foo: I failed, miserably" );
    }

    return Object( arg1, arg2, arg3 );
}

现在还有很多其他方法可以做到这一点,但上面是最自然的,直接使用旨在支持和完全解决这些方面的语言功能。

答案 2 :(得分:0)

unique_ptr<Input> input_ptr = read();

其中read()定义为:

unique_ptr<Input> read()
{
    .
    .
    .
    return unique_ptr<Input>(new Input(x,y,z));
}

答案 3 :(得分:0)

如果您处于C + 11之前的世界,可以使用malloc解决方法:

bool read(Input &input); // keep the function read intact 

Input* input = static_cast<Input*>(malloc(sizeof(Input))); // bypass constructor
bool success = read(*input);
...
free(input); // don't forget to free input later