#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();
}