构造函数中的C ++初始化列表

时间:2014-10-11 02:23:12

标签: c++ constructor initialization-list

我试图初始化一个名为" 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];
}

1 个答案:

答案 0 :(得分:1)

从它的外观来看,这些行:

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

基本上什么也没做,因为locationname字符串没有被分配甚至写入,这可能是问题的根源。不过,您的acresrating应该已经正确构建。

以下是我创建的工作版本(在此处显示 - > 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