2015-02-05 7 views
2

Предположим, у меня есть объект, который может быть неправильно инициализирован, но это не просто нулевой указатель на объект; это объект с пустыми или неинициализированными членами. Но я хочу, чтобы проверить его в качестве читаемым образом, как если бы это был указатель:Проверка действительности объекта C++, как если бы он был указателем

if (Object) use(Object); 

Например, объект может иметь int поле, которое, если 0, считается неинициализированным. Тогда я могу сделать перегруз! оператор так:

bool operator!() const {return intField == 0;} 

я могу использовать его так:

if (! Object) initialize (Object); 

Дело в том, если я хочу, чтобы проверить на противоположное состояние (не нуль-Ness), я не могу сделать именно это:

if (Object)... 

Я только найти неловкое возможности:

if (! (! Object))... // awful 
if (Object.notNull()) // not so bad 

ближе всего к моим желаниям сбивают с толку:

bool operator()() {return intField != 0;} 
if (Object())... // it looks a lot like an argument-less constructor 

AFAIK, нет BOOL возвращающих пустого оператора (что-то вроде bool operator() {...}) или любой другой трюк или идиомы, которые могут достичь этого.

Любые идеи читаемого решения, кроме метода notNull()? Благодарю.

ответ

3

Вы можете предоставить оператор преобразования типа, чтобы преобразования в bool:

explicit operator bool() const {return intField != 0;} 

Это позволяет использовать его в логических контекстах, таких как if условиях. explicit является необязательным, но рекомендуется предотвратить потенциально запутывающие преобразования в числовые типы.

Альтернативный подход - использовать Boost.Optional или аналогичный, чтобы сделать любой тип нулевым.

0

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

В этом случае, я бы рекомендовал следующее явное обозначение:

if (Object.isValid()) use(Object); 

Таким образом, очевидно, к следующему человеку, который читает код в точности то, что вы здесь делаете. Перегрузка оператора всегда должна быть очевидна для человека, использующего его, и проверка подлинности/ложности объекта означает, что существует или нет, не обязательно, если это действительный или нет.

+0

Я согласен, потому что код должен быть как можно более ясным. Но, с другой стороны, операторы перегрузки много о концептуальном рассмотрении объектов, и если вы привыкли писать (или, по крайней мере, читать) 'if (pointer)', чтобы проверить, что 'pointer' не является нулевым, вы можете найти что 'if (object)' концептуально понятен. Это вопрос нахождения хорошего баланса между ясностью, многословием и концептуальной адекватностью. – JMB

Смежные вопросы