2013-11-28 2 views
2

У меня есть класс с методом, со следующей подписью:Как инициализировать «unsigned char *» с аргументом по умолчанию в C++?

void print(unsigned char *word); 

Мне нужно установить "" в качестве значения по умолчанию для word, как я могу сделать это?

Я попробовал очевидные void print(unsigned char *word="");, но я получил следующее сообщение об ошибке:

error: cannot initialize a parameter of type 
    'unsigned char *' with an lvalue of type 'const char [1]' 
    void print(unsigned char *word=""); 

Поскольку я не могу инициализировать word с строковым литералом, который я должен это делать?

+0

Указатели не инициализируются таким образом –

+0

Почему вы не хотите использовать 'std :: string'? –

+0

Вам нужно изменить слово внутри 'print()'? В противном случае напишите 'void print (const char * word);'. –

ответ

6

Вы говорите, что это «префикс» аргумент применить к печати.

Ответ в том, что вы должны сделать аргумент const, перестать делать то, что мутации вы делаете с ним внутри функции, а затем использовать "" в качестве аргумента по умолчанию:

void print(const char* prefix = "") 
+0

, даже если я завершу все изменения в копии и сделаю этот аргумент 'const', вы отвечаете, не работают, потому что мне по-прежнему нужен' unsigned char' и строковый литерал, несовместимые – RSFalcon7

+0

@ RSFalcon7: вам не нужно " неподписанный символ. –

+0

Я делаю, эта проблема сложнее, чем то, что я показываю здесь, и 'unsigned char' - это не просто прихоть. – RSFalcon7

4

"" дает массив из const char, после чего вам нужен массив или указатель на NON-const unsigned char, и тип, и квалификация cv не подходят.

Обратите также внимание на то, что в C++ char != signed char и char != unsigned char.

Возможно, вы имели в виду void print(const char *word);, но, вероятно, вы хотите только print(std::string const &) или print(std::string).

+0

Я не хочу никаких типов 'const', просто инициализации для' unsigned char * ' – RSFalcon7

+4

@ RSFalcon7 Вы не можете инициализировать указатель на не-const символы с строковым литералом (который является' const'). – Angew

+1

@ RSFalcon7: «Я не хочу никаких типов const», почему? –

6

попробовать

unsigned char empty[] = { 0 }; 

void print(unsigned char* word = empty) 
{ 
    ... 
} 
+0

@ Планы гонок на орбите, вы считаете, что это нормально, чтобы дать ему массив символов *, который он может только безопасно написать байт для? – RichardPlunkett

+0

@RichardPlunkett: Хорошо, я дам вам, так как он хочет изменить этот аргумент, тогда там может быть дыра. Надеюсь, он изменит его только тогда, когда на самом деле будет содержаться текст. –

+0

да, но тогда это не лучше, чем наличие «в памяти константы» и, возможно, намного хуже. – RichardPlunkett

0
void print(); 
void print(unsigned char* prefix); 
// in cpp file: 
void print(){ 
    unsigned char temp = 0; 
    print(&temp); 
} 

Это обеспечивает две перегрузки, одна с 0 и одна с одним аргументом.

Нулевой аргумент имеет некоторую автоматическую память, которую он предоставляет одному аргументу. Обратите внимание, что только один байт под указателем действителен для чтения/записи: без длины print не имеет никакого способа узнать никого другого.

Несмотря на отсутствие массива, для одного элемента не требуется ни одного элемента.

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