Почему я не могу инициализировать массив символов в структуре? - PullRequest
0 голосов
/ 07 сентября 2018
typedef struct book {

   int a;
   int b;
   char cb[100];

   book(int a1, int b1, char* cb1) {
       a = a1;
       b = b1;
       cb = cb1;
   }

} book;

Почему я не могу инициализировать cb к cb1 и как это сделать без strcpy?

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Вы спрашиваете, почему вы не можете инициализировать char[] в struct?

Ответ на ваш вопрос таков:

Массивы `` второго классаграждане в С;Одним из следствий этого предубеждения является то, что вы не можете назначить им.Массив не является изменяемым lvalue в C & C ++.

C & C ++ оба являются разными языками программирования.Следует избегать использования простых старых массивов в стиле C в C ++, потому что язык C ++ предлагает удобные и лучшие его альтернативы.

Поскольку этот вопрос был помечен как вопрос C ++, идиоматическим решением было бы использовать std :: string в C ++.

Итак, будет лучше, если вы выполните следующее:

#include <string>

struct book {

   int a;
   int b;
   std::string cb;

   book(int a1, int b1, std::string cb1) {
       a = a1;
       b = b1;
       cb = cb1;
   }

} book;
0 голосов
/ 07 сентября 2018

Ваш пост помечен [C ++], но не использует современные идиомы.Вот версия, которая допускает простую инициализацию.Используя std::string, вы избегаете сложной инициализации.

Обратите внимание, что вам не нужно переименовывать ваши параметры.

Использование std::string

#include <iostream>
#include <string>

class book {
public:
   int a;
   int b;
   std::string cb;

   book(int a, int b, const char* cb)
    : a(a),
      b(b),
      cb(cb)
    {
    }
};

int main()
{
    using namespace std;
    const book test(5, 17, "Woot!");
    cout << "Hello " << test.cb << endl; 

    return 0;
}

Вывод

$main
Hello Woot!
0 голосов
/ 07 сентября 2018

Почему я не могу инициализировать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...