2012-05-07 4 views
1

Предположим, у меня есть этот код. Ваш основной «если вызывающий не предоставляет значение, вычисляет значение».Что было бы неправильным значением для указателя?

void fun(const char* ptr = NULL) 
{ 
    if (ptr==NULL) { 
     // calculate what ptr value should be 
    } 
    // now handle ptr normally 
} 

и называют это либо

fun();   // don't know the value yet, let fun work it out 

или

fun(something); // use this value 

Однако, как выясняется, ПТР может иметь все виды ценностей, в том числе NULL, так что я не могу используйте NULL в качестве сигнала о том, что вызывающий абонент не предоставляет ptr.

Так что я не уверен, что значение по умолчанию дает ptr вместо NULL. Какую магическую ценность я могу использовать? У кого-нибудь есть идеи?

+1

Указатель должен либо точку на правильный объект или быть пустым - все остальное на рожон. Может быть, вы хотите [Boost.Optional] (http://www.boost.org/libs/optional/)? – ildjarn

+1

Какая разница между предоставлением 'NULL' и не предоставлением ptr? Как обычно функция «обрабатывает» NULL и как будет обрабатываться, когда ptr «не предоставляется»? –

+0

В моей первоначальной концепции не было бы разницы между fun(); 'и' fun (NULL); '. Потому что я не планировал использовать NULL. Но теперь у меня есть возможность сделать «fun (NULL)» и обработать его нормально. Это проблема. Отредактировал мой вопрос. –

ответ

4
void fun() 
{ 
    // calculate what ptr value should be 
    const char* ptr = /*...*/; 

    // now handle ptr normally 
    fun(ptr); 
} 
+0

Я думаю, что это то, что мне нужно, да. Вы можете назвать другую функцию одинаковой, хотя, как указал irobot позже. –

0

1?

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

+0

Хм, вы знаете, я на самом деле думал об этом, но нет. Гордость моего программиста запрещает это. Это просто не так. –

1

Для этого вам необходимо использовать nullptr. Его новый в стандарте C++ 11. Посмотрите here для некоторых объяснений.

+1

'nullptr' следует использовать вместо NULL, но это не решит его проблему. – mfontanini

+0

Хм, не могу проверить сейчас, не хватает современного компилятора. Сожалею. –

2

В зависимости от вашей платформы указатель, вероятно, имеет 32 или 64-битное значение.

В этих случаях рекомендуется использовать:

0xFFFFFFFF or 0xFFFFFFFFFFFFFFFF 

Но я думаю, более важный вопрос: «Как может NULL быть принят в качестве действительного параметра?»

Я бы рекомендовал вместо иметь другой параметр:

void fun(bool isValidPtr, const char* ptr = NULL) 

или, может быть:

void fun(/*enum*/ ptrState, const char* ptr = NULL) 
+0

Хорошая точка. Я могу помнить об этом в следующий раз. Мне нравится ответ Ронага, хотя для моего случая. –

2

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

void fun() 
{ 
    // Handle no pointer passed 
} 

void fun(const char* ptr) 
{ 
    // Handle non-nullptr and nullptr separately 
} 
+1

Я предпочитаю это, он отделяет ожидаемое поведение и проверяет от одного тела функции к другому и сохраняет второе определение более чистым и менее подверженным ошибкам, с пустой версией arg вы просто делаете по умолчанию или возвращаете – EdChum

1

Использование перегруженных версий th е та же функция для различных входных лучше, но если вы хотите использовать одну функцию, вы могли бы сделать параметр быть указатель на указатель вместо:

void fun(const char** ptr = NULL) 
{ 
    if (ptr==NULL) { 
     // calculate what ptr value should be 
    } 
    // now handle ptr normally 
} 

Тогда вы можете назвать это так:

fun(); 

.

char *ptr = ...; // can be NULL 
fun(&ptr); 
1

Если вы хотите получить специальное значение, которое не соответствует полезному аргументу, сделайте это.

заголовок файла:

extern const char special_value; 

void fun(const char* ptr=&special_value); 

реализация:

const char special_value; 

void fun(const char* ptr) 
{ 
    if (ptr == &special_value) .... 
} 
+0

Это тоже хороший трюк, Должен это помнить. –

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