2013-02-21 4 views
1

не по умолчанию, напримерВыход из функции, со ссылкой, объектом типа с конструктором

bool read(Input &input); 

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

будет ошибкой, потому что вход не имеет конструктора по умолчанию.

Есть ли какие-либо обман, которые я могу использовать, чтобы получить объект ввода из функции в этом случае? Я предполагаю, что для меня может быть какая-то уникальная хитрость, но я точно не знаю, как это сделать. Не стесняйтесь предлагать другие методы.

Пожалуйста, предложите пример использования функции чтения.

Я бы предпочел не создавать (бессмысленный) конструктор по умолчанию для ввода только для этой цели и отметить, что это просто глупый пример, поэтому не добавляйте никакого особого значения в слова «Вход», «читать», и т.д. :)

+0

ли 'чтения () 'возвращает' Input' и 'throw' исключение при ошибке? – hmjd

+0

Почему бы не сделать 'Input read();'? – PlasmaHH

+0

Поскольку в моем случае тип возврата будет важен, и даже «ложь» не является недопустимым, чтобы быть исключением. – user2015453

ответ

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

Да, я представляю себе что-то подобное, но проблема в том, что вы не можете переназначить указатель ввода внутри функции чтения. Думаю, я мог бы сделать «input.reset (new whatever)», но правильно ли это звучит? – user2015453

+0

«unique_ptr» достаточно сам по себе, чтобы сигнализировать «нет объекта», поэтому я не вижу цели передать его по ссылке с результатом функции «bool». Кроме того, динамическое распределение по сравнению с обычным распределением стека C++ крайне неэффективно. Итак, какой веский аргумент заключается в том, чтобы взять на себя эту многословие, мрачность и неэффективность? –

+0

@ Cheers и hth. - Alf: это просто глупый пример, поэтому не добавляйте никакого особого значения в слова «Вход», «читать» и т. Д. ...Потому что в моем случае тип возврата будет важен, и даже «ложь» не является недопустимой. – qPCR4vir

0

Из комментариев, кажется, что ваша проблема заключается в разработке функции,

  • может потерпеть неудачу (и если это так должно означать, что для вызывающего абонента),

  • , но если нет, то производит значение типа без cconstructor по умолчанию

Первая точка легко: исключения использования.

Вторая точка также проста: используйте функцию возвращаемого значения функции.

есть,

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

    return Object(arg1, arg2, arg3); 
} 

В настоящее время существует также много других способов сделать это, но выше, является наиболее естественным, непосредственно используя возможности языка, которые предназначены для поддержки и полностью решить эти аспекты.

0
unique_ptr<Input> input_ptr = read(); 

где read() определяется как:

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

. Более эффективным и безопасным вариантом является использование реализации класса «Баббл» Бартона и Накмана, такого как «boost :: optional». Также тривиально реализовать (через несколько минут) внутренний тип POD. Я не предлагал этого в своем ответе - я просто заявил, что возможностей гораздо больше - потому что, очевидно, ОП изучает основы C++. –

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