我有一个类对象作为另一个类的成员,我如何初始化为一个安全的空状态?

时间:2013-03-22 16:39:17

标签: c++ constructor

我有2个班级,ISBN,Order。我有一个ISBN对象作为我的Order类的数据成员,我遇到了Order构造函数的问题,无法将ISBN对象置于安全的空状态。

我的Order.h

#include <iostream>
using namespace std;

class ISBN;

class Order {

int ordered;
int delivered;
ISBN * book;
bool empty;

public:

Order();
Order(const ISBN & isbn);


};

我的ISBN.h

#include <iostream>
using namespace std;

class ISBNPrefix;

class ISBN {

char isbnNum[13];
char area[6];
char publisher[8];
char title[7];
char checkDigit[1];
bool emptycheck;
bool registered;

public:

ISBN();
ISBN(const char * str, const ISBNPrefix& list);
}

在我的Order构造函数中,我尝试了这段代码:

Order::Order() {

ordered = 0;
delivered = 0;
empty = true;

*book->ISBN();

/*
(*book).isbnNum[0] = '\0';
book.area[0] = '\0';
book.publisher[0] = '\0';
book.title[0] = '\0';
book.checkDigit[0] = '\0';
book.emptycheck = true;
book.registered = false; */
}   

它的变化,但我得到的错误如:“不允许输入类型名称”“表达式必须有指针类型”等等......任何人都知道我的问题是什么?

2 个答案:

答案 0 :(得分:2)

你几乎肯定不希望这里有一个指针,只是一个ISBN对象作为数据成员:

ISBN book;

这将使用其默认构造函数自动初始化;你不需要做任何事情。如果你想使用其他构造函数(带参数)初始化它,那么你需要在初始化列表中执行此操作:

Order::Order() : book(some_string, some_list)
{
    // body of constructor
}

答案 1 :(得分:1)

您遇到问题是因为您已将book声明为ISBN*。因此,您发布的行*book->ISBN();正在尝试取消引用null,然后调用空白构造函数。

如果您想手动分配book,那么您应该使用此模式:

Order::Order() {

    ordered = 0;
    delivered = 0;
    empty = true;
    book = new ISBN();
}   

请注意,这需要Order的析构函数在其book成员上调用delete。

您可以通过使book成为类成员而不是指针来自动分配和删除ISBN。为此,请使用此声明:

class Order {

    ISBN book;
    ... // your other members
}

每当分别对ISBN类进行实例化和销毁时,这将自动分配并自动释放Order对象成员。无需额外的步骤。