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

I have a class object as a member of another class, how do I initialize as a safe empty state?

本文关键字:初始化 安全 状态 另一个 有一个 成员 对象      更新时间:2023-10-16

我有两个类,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] = '';
book.area[0] = '';
book.publisher[0] = '';
book.title[0] = '';
book.checkDigit[0] = '';
book.emptycheck = true;
book.registered = false; */
}   

和它的变化,但我得到错误,如:"类型名称是不允许的"表达式必须有指针类型"等…有人知道我的问题是什么吗?

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

ISBN book;

This将使用其默认构造函数自动初始化;你不需要做任何事情。如果您想使用其他构造函数(带参数)初始化它,则需要在初始化器列表中进行初始化:

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

您有问题,因为您已将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
}

这将在分别创建和销毁Order类时自动分配和释放ISBN对象成员。