1

例如

bool read(Input &input);

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

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

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

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

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

4

4 回答 4

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();
于 2013-02-21T14:17:15.027 回答
0

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

  • 可能会失败(如果是这样,应该向调用者发出信号),

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

第一点很简单:使用异常。

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

IE,

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

    return Object( arg1, arg2, arg3 );
}

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

于 2013-02-21T14:18:27.377 回答
0
unique_ptr<Input> input_ptr = read();

其中read()定义为:

unique_ptr<Input> read()
{
    .
    .
    .
    return unique_ptr<Input>(new Input(x,y,z));
}
于 2013-02-21T14:21:58.083 回答
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
于 2013-02-22T11:32:21.740 回答