例如
bool read(Input &input);
Input input; //error
bool success = read(input);
将是一个错误,因为Input没有默认构造函数。
在这种情况下,我是否可以使用任何技巧将Input对象从函数中移除?我想我必须有一些unique_ptr技巧,但我不确定如何。随意建议其他方法。
请举例说明读取功能的外观。
我不想为此目的而为Input创建一个(无意义的)默认构造函数,并注意这只是一个愚蠢的例子,所以不要在“Input”,“read”这两个词上附加任何特殊含义,等:))
答案 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