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

C++ 我有一个类对象作为另一个类的成员,如何初始化为安全的空状态?,c++,constructor,C++,Constructor,我有两门课,ISBN,Order。我有一个ISBN对象作为Order类的数据成员,并且我在Order构造函数中将ISBN对象置于安全的空状态时遇到问题 我点的 #include <iostream> using namespace std; class ISBN; class Order { int ordered; int delivered; ISBN * book; bool empty; public: Order(); Order(const ISBN &

我有两门课,ISBN,Order。我有一个ISBN对象作为Order类的数据成员,并且我在Order构造函数中将ISBN对象置于安全的空状态时遇到问题

我点的

#include <iostream>
using namespace std;

class ISBN;

class Order {

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

public:

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


};

和它的变体,但我得到了一些错误,如:“不允许使用类型名称”“表达式必须具有指针类型”等。有人知道我的问题是什么吗?

您几乎肯定不希望在这里使用指针,只需要一个
ISBN
对象作为数据成员:

ISBN book;
这将使用其默认构造函数自动初始化;你不需要做任何事。如果要使用另一个构造函数(带参数)初始化它,则需要在初始化器列表中执行此操作:

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

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

ISBN book;
这将使用其默认构造函数自动初始化;你不需要做任何事。如果要使用另一个构造函数(带参数)初始化它,则需要在初始化器列表中执行此操作:

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

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

如果要手动分配
图书
,则应使用以下模式:

Order::Order() {

    ordered = 0;
    delivered = 0;
    empty = true;
    book = new ISBN();
}   
注意这将要求
Order
的析构函数在其
book
成员上调用delete

您可以将
book
作为
ISBN
自动分配和删除,方法是将其设置为类成员,而不是指针。为此,请使用以下声明:

class Order {

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

每当类
订单
分别被建立和销毁时,这将自动分配和自动取消分配
ISBN
对象成员。无需其他步骤。

您遇到问题,因为您已将
书籍
声明为
ISBN*
。因此,您发布的行
*book->ISBN()试图引用null,然后调用空白构造函数。

如果要手动分配
图书
,则应使用以下模式:

Order::Order() {

    ordered = 0;
    delivered = 0;
    empty = true;
    book = new ISBN();
}   
注意这将要求
Order
的析构函数在其
book
成员上调用delete

您可以将
book
作为
ISBN
自动分配和删除,方法是将其设置为类成员,而不是指针。为此,请使用以下声明:

class Order {

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

每当类
订单
分别被建立和销毁时,这将自动分配和自动取消分配
ISBN
对象成员。不需要额外的步骤。

Oh ok没有想到它会自动初始化。我的构造函数和Order类的复制构造函数呢?既然我必须初始化其他数据成员,我该如何处理book对象?如果我只是将其声明为“ISBN book”,我还会遇到另一个错误,错误是:“字段“book”不完整type@user2140629:如果是数据成员,则隐式复制构造函数和赋值运算符将其复制到新对象。同样,您无需执行任何操作。@user2140629:若要使其成为成员,则定义必须可用。您需要
#包括“ISBN.h”
,而不仅仅是声明
类ISBN。好的,nvm让它工作了。我刚刚将#include“ISBN.h”的位置更改为我的Order.h文件,它成功了,谢谢!哦,好吧,我没想到它会被自动初始化。我的构造函数和Order类的复制构造函数呢?既然我必须初始化其他数据成员,我该如何处理book对象?如果我只是将其声明为“ISBN book”,我还会遇到另一个错误,错误是:“字段“book”不完整type@user2140629:如果是数据成员,则隐式复制构造函数和赋值运算符将其复制到新对象。同样,您无需执行任何操作。@user2140629:若要使其成为成员,则定义必须可用。您需要
#包括“ISBN.h”
,而不仅仅是声明
类ISBN。好的,nvm让它工作了。我刚刚将#include“ISBN.h”的位置更改为我的Order.h文件,它成功了,谢谢!