Почему я не могу инициализировать cb к cb1 и как это сделать без strcpy?
cb1
имеет тип char*
, но cb
является C-Массив стиля, иначе говоря, объект типа массива (в частности, char[100]
). Объекты типа массива нельзя изменить (даже если они lvalue s).Если вы хотите только мелкую копию , а не strcpy()
, как вы говорите, тогда вы можете определить cb
как char*
вместо char[100]
:
typedef struct book {
// ...
char* cb;
book(int a1, int b1, char* cb1) {
// ...
cb = cb1;
}
} book;
Но в большинстве сценариев я бы не рекомендовал делать это , так как это привело бы к ненадежному управлению этим необработанным указателем.Это помечено [C ++], любая причина не использовать std::string
?
Примечание. Пока вы не пометили это [C ++ 11] или выше, далеепричина не использовать такие необработанные указатели или массивы в стиле C, как это происходит, когда вы пытаетесь использовать вышеупомянутую структуру, вероятно, вот так:
int main() {
book b(4, 2, "Hello");
return 0;
}
Довольно стандартный компилятор, такой как Clang, немедленно разрешитвы знаете, что 1 :
ISO C ++ 11 не разрешает преобразование строкового литерала в 'char *
'.
Это неявноепреобразование из строкового литерала ( типа const char[]
) в char*
устарело даже в C ++ 03, а теперь полностью удалено с C ++11.
1 По умолчанию это будет, по крайней мере, предупреждение и ошибка при построении, например, с -pedantic-errors
.