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

C++ initialization list in constructor

本文关键字:初始化 列表 C++ 构造函数      更新时间:2023-10-16

我正在尝试初始化一个名为"酿酒厂"将构造函数中的初始化列表用于另一个名为"的类;列表"问题是,当我把一个酒庄交给酒庄建设者复制时,它没有复制信息。

这是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(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];
}

从外观上看,这些行:

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

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

这是我创建的一个工作版本(也是在Ideone):

#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("%sn", node.item.getName());
    printf("%sn", node.item.getLocation());
    printf("%in", node.item.getAcres());
    printf("%in", node.item.getRating());
}

输出:

Mission Hill Winery
Kelowna, BC, Canada
646
4