我有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; */
}
它的变化,但我得到的错误如:“不允许输入类型名称”“表达式必须有指针类型”等等......任何人都知道我的问题是什么?
答案 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
对象成员。无需额外的步骤。