C++ 我有一个类对象作为另一个类的成员,如何初始化为安全的空状态?
我有两门课,ISBN,Order。我有一个ISBN对象作为Order类的数据成员,并且我在Order构造函数中将ISBN对象置于安全的空状态时遇到问题 我点的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 &
#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文件,它成功了,谢谢!