C недопустимое преобразование из ‘const char *’ в char*

#c

#c

Вопрос:

Я новичок в C . У меня есть упражнение о конструкторе с параметром const char *.

 class Book
{
private: 
   char* title;
}
public:
   Book (const char* title)
   {
      this->title = title;
   } 

  

Когда я таким образом кодирую конструктор, я получаю сообщение об ошибке не удается преобразовать const char в char *.
Я пытался использовать
strcpy(this->title, title);
затем он запускается, но я не получаю ожидаемого результата.
Кто-нибудь может мне помочь.
Большое вам спасибо.

Комментарии:

1. strcpy(this->title, title); это правильно, но вам нужно выделить память для хранения копии строки. В настоящее время this-> title нигде не указывает. Может быть, попробуйте strdup () en.cppreference.com/w/c/experimental/dynamic/strdup Просто убедитесь, что вы освободили его в своем деструкторе

2. Джерри и паксдиабло оба правы. Просто чтобы добавить еще один вариант: сделайте переменную-член const и используйте инициализацию вместо присваивания.

Ответ №1:

Вы выполняете упражнение, не объяснял ли курс, которому вы следуете, что вы должны делать?

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

 this->title = new char[strlen(title)   1];
strcpy(this->title, title);
  

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

Но любой программист на C , который делал это по-настоящему (вместо того, чтобы быть учебным упражнением), использовал бы a std::string , как говорит paxdiablo.

Комментарии:

1. Спасибо! Я понял свою проблему. Мое упражнение состоит в том, чтобы написать конструктор, не требующий использования strcpy , но я не знаю, как писать, не используя его

Ответ №2:

C не позволяет вам легко изменить a const char * на a char * , поскольку последний не имеет ограничений на то, как вы можете изменять данные за этим указателем.

Если вы используете C , вам следует избегать char * (устаревших C) строк, насколько это возможно. При необходимости обязательно используйте их в качестве параметров, но вы должны превратить их в строки C при первой возможности:

 class Book {
private: 
   std::string m_title;
public:
    Book (const char *title) {
        m_title = title;
    }
};
  

Единственное, чем вы не хотите становиться, — это разработчик C , эта странная порода, которая так и не совершила скачок от C к образу мышления C 🙂


И, на самом деле, если ожидается, что данная книга никогда не изменит свое название, вам лучше сделать его постоянным и инициализировать его, а не присваивать ему что-то вроде:

 #include <iostream>
#include <string>

class Book {
    public:
    Book (const char* title): m_title(title) {};
    void Dump() { std::cout << m_title << "n"; }

    private:
    const std::string m_title;
};

int main() {
    Book xyzzy("plugh");
    xyzzy.Dump();
}