Конструктор берет по своему типу?

0

В настоящее время я пытаюсь разработать файл.cpp для проекта, но я получаю seg-ошибку, когда я пытаюсь запустить его с тестовым файлом, предоставленным для удовлетворения. Я подозреваю, что нашел, где ошибка, но я не могу на всю жизнь найти решение.

В принципе, класс Product инициализируется в тестовом файле, как показано ниже.

Product * orderItem = new Product(*wonkaBar_retail);

Где wonkaBar_retail является указателем на объект Product - так что в основном конструктор для Product принимает объект своего типа... Я даже не уверен, что он должен работать. Как я уже сказал, этот код, включая часть, которая создает экземпляр wonkaBar_retail, был предоставлен, поэтому я попытался компенсировать это, создав такой конструктор

Product(Product) {
//Constructor in the header file
}

и даже так

Product(const Product&) {
//Other style
}

Это просто дало мне несколько ошибок компилятора, которые компилятор даже не удосужился объяснить...

Может кто-то уточнить, как это должно работать, и если это вообще вызовет segfault?

  • 0
    хорошо, конструктор Product(const Product&) является конструктором копирования, предназначенным для копирования переданного в Product чтобы не ссылаться на другое.
  • 1
    используйте отладчик, чтобы узнать, где находится ваш код, или отправьте больше кода. Отладка 1 строки кода для нас невозможна.
Показать ещё 3 комментария
Теги:
constructor
segmentation-fault

1 ответ

3

Строка, которую вы предоставили, использует конструктор копирования для класса Product который является совершенно законным. На самом деле, если вы не предоставляете свой собственный конструктор копирования для класса, компилятор будет генерировать его для вас.

Конструктор копирования ссылается на другой объект того же типа и инициализирует новый объект в том же состоянии, что и другой объект. Как правило, подпись конструктора копии выглядит так:

Product(const Product& other);

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

Рассмотрим следующий класс:

class Buffer
{
public:
    Buffer(int dataSize) : m_dataSize(dataSize) { m_data = new char[m_dataSize]; }
    ~Buffer() { delete[] m_data; }

private:
    int m_dataSize;
    char* m_data;
};

Конструктор копии по умолчанию для этого класса будет выглядеть так:

Buffer::Buffer(const Buffer& other)
{
    m_dataSize = other.m_dataSize;
    m_data = other.m_data;

}

Это явно не то, что вы хотите. Во-первых, если объект, который вы копируете, удаляется, данные, на которые указывает ваш новый объект, также будут удалены. И затем, когда вы удаляете свой новый объект, вы попытаетесь дважды удалить те же данные, что очень плохо.

То, что вы действительно хотите сделать, это выделить новые m_data для вашего нового объекта и скопировать данные из другого объекта следующим образом:

Buffer::Buffer(const Buffer& other)
{
    m_dataSize = other.m_dataSize;
    m_data = new char[m_dataSize];
    for (int i = 0; i < m_dataSize; ++i)
    {
        m_data[i] = other.m_data[i];
    }
}
  • 0
    Я был бы очень признателен за объяснение понижения.
  • 0
    Я ничего не отрицал, но попробую. Спасибо!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню