0

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

我的订单.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; */
}   

以及它的变体,但我收到诸如“不允许类型名称”“表达式必须具有指针类型”等错误......有人知道我的问题是什么吗?

4

2 回答 2

2

您几乎可以肯定这里不需要指针,只需要一个ISBN对象作为数据成员:

ISBN book;

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

Order::Order() : book(some_string, some_list)
{
    // body of constructor
}
于 2013-03-22T16:42:40.097 回答
1

您遇到问题是因为您已声明bookISBN*. 因此,您发布的行*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分别被实例化和销毁时,这将自动分配和自动取消分配对象成员。无需额外的步骤。

于 2013-03-22T16:53:12.803 回答