2014-10-11 2 views
1

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

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

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) 
{ 
} 

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

EDIT: Вот мой 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]; 
} 
+0

Вы должны определить, что вы имеете в виду под "не удается скопировать данные" поскольку это может означать что угодно. Как выглядит деструктор? Я предполагаю, что деструктор удаляет строки 'newName' и' newLocation'. Есть ли причина, по которой вы не используете 'const char *' вместо 'std :: string'? –

+0

Я имею в виду, что когда конструктор прошел список инициализации, я смотрю на 'item',' nextByName' и 'nextByRating' в памяти. 'nextByName' и' nextByRating' были инициализированы на 'NULL', но все четыре части' item' по-прежнему имеют значения памяти по умолчанию для Visual Studio (0xcdcdcdcd, 0xfeeffeef и т. д.) И причина, по которой я использую 'const char * '- это потому, что нам запрещено использовать' std :: string'. – user3698112

ответ

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 
+0

Очень полезно, спасибо! – user3698112

Смежные вопросы