Список инициализации C ++ в конструкторе

Я пытаюсь инициализировать экземпляр класса под названием «Winery», используя список инициализации в конструкторе для другого класса под названием «List». Проблема в том, что когда я передаю конструктору Winery винный завод для копирования, он не может скопировать информацию.

Это файл заголовка для класса Winery:

class Winery
{
public:

    Winery(const char * const name, const char * const location, const int acres, const int rating);
    virtual ~Winery(void);

    const char * const getName() const { return name; }
    const char * const getLocation() const { return location; }
    const int getAcres() const { return acres; }
    const int getRating() const { return rating; }

private:
    char    *name;
    char    *location;
    int     acres;
    int     rating;
};

Вот соответствующая часть файла заголовка для моего класса List:

struct Node
    {
        Node(const Winery& winery);     
        Winery item;                                            
        Node *nextByName;               
        Node *nextByRating;             
    };

Вот конструктор в моем классе List:

List::Node::Node(const Winery& winery) :
item(winery.getName(), winery.getLocation(), winery.getAcres(), winery.getRating()),
nextByName(nullptr),
nextByRating(nullptr)
{
}

Судя по тому, что я вижу, похоже, что я делаю все, что мне нужно. Члены данных винодельни, которые я передаю конструктору, являются частными, поэтому я пытаюсь получить их с помощью функций, которые получают информацию. Они в правильном порядке и все такое. Указатели работают нормально после того, как я их инициализирую, но информации там нет, поэтому я действительно не знаю, что здесь делать. Если вам интересно, это для задания, и мы ДОЛЖНЫ использовать списки инициализации (я пробовал это без них, и это тоже не работает, поэтому я действительно не знаю, что делать). Буду очень признателен за любую помощь! Спасибо!

РЕДАКТИРОВАТЬ: Вот мой конструктор Winery:

Winery::Winery(const char * const name, const char * const location, const int acres, const int rating) :
acres(acres),
rating(rating)
{
    char *newName = new char[sizeof(name) + 1];
    char *newLocation = new char[sizeof(location) + 1];
}

person user3698112    schedule 11.10.2014    source источник
comment
Вы должны определить, что вы имеете в виду под невозможностью скопировать информацию, поскольку это может означать что угодно. Как выглядит деструктор? Я предполагаю, что деструктор удаляет строки newName и newLocation. Есть ли причина, по которой вы не используете const char* вместо std::string?   -  person Colin Basnett    schedule 11.10.2014
comment
Я имею в виду, что когда конструктор прошел через список инициализации, я смотрю на item, nextByName и nextByRating в памяти. nextByName и nextByRating были инициализированы как NULL, но все четыре части item по-прежнему имеют в себе значения памяти Visual Studio по умолчанию (0xcdcdcdcd, 0xfeeffeef и т. Д.) И причина, по которой я использую const char*, заключается в том, что нам запрещено использовать std::string .   -  person user3698112    schedule 11.10.2014


Ответы (1)


Судя по всему, эти строки:

char *newName = new char[sizeof(name) + 1];
char *newLocation = new char[sizeof(location) + 1];

практически ничего не делают, поскольку строки location и name не назначаются и даже не записываются, что, вероятно, является корнем проблемы. Однако ваши acres и rating должны были быть правильно сконструированы.

Вот рабочая версия, которую я создал (здесь ideone -> http://ideone.com/v98zpq)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

class Winery
{
public:
    Winery(const char * const name, const char * const location, const int acres, const int rating) :
        name(strdup(name)),
        location(strdup(location)),
        acres(acres),
        rating(rating)
    {
    }

    virtual ~Winery(void)
    {
        free(name);
        free(location);
    }

    const char * const getName() const { return name; }
    const char * const getLocation() const { return location; }
    const int getAcres() const { return acres; }
    const int getRating() const { return rating; }

private:
    char    *name;
    char    *location;
    int     acres;
    int     rating;
};

struct Node
{
    Node(const Winery& winery);
    Winery item;
};

Node::Node(const Winery& winery) :
    item(winery.getName(), winery.getLocation(), winery.getAcres(), winery.getRating())
{
}

int main()
{
    Winery winery("Mission Hill Winery", "Kelowna, BC, Canada", 646, 4);

    Node node(winery);

    printf("%s\n", node.item.getName());
    printf("%s\n", node.item.getLocation());
    printf("%i\n", node.item.getAcres());
    printf("%i\n", node.item.getRating());
}

Вывод:

Mission Hill Winery
Kelowna, BC, Canada
646
4
person Colin Basnett    schedule 11.10.2014