2014-10-11 101 views
1

我试图初始化一个名为“Winery”的类的实例,它使用构造函数中的另一个名为“List”的类的初始化列表。问题是,当我将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; 
}; 

这里是头文件对我的列表类的相关部分:

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

这里是我的列表类的构造函数:

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

从我看到的,它看起来像我正在做我需要做的一切。我传递给构造函数的酒厂的数据成员是私有的,所以我试图通过获取信息的函数来获取它们。他们处于正确的秩序和一切。指针在我初始化之后工作得很好,但信息不存在,所以我真的不知道该怎么做。如果你想知道,这是一个任务,我们必须使用初始化列表(我试过没有它们,这不起作用,所以我真的不知道该怎么做)。我将不胜感激任何帮助!谢谢!

编辑:这是我的酒厂构造:

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'? – 2014-10-11 03:10:06

+0

我的意思是,当构造函数已经通过初始化列表时,我查看内存中的'item','nextByName'和'nextByRating'。 'nextByName'和'nextByRating'已经被初始化为'NULL',但是'item'的所有​​四个部分仍然具有Visual Studio默认的内存值(0xcdcdcdcd,0xfeeffeef等),而我使用'const char *'是因为我们被禁止使用'std :: string'。 – user3698112 2014-10-11 03:20:43

回答

1

从外观上来看,这些行:

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

基本上做什么,作为locationname字符串不分配,甚至写,这可能是问题的根源。但是,您的acresrating应该已经正确构造。

这里是我创建了一个工作版本(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 2014-10-11 03:50:30