我有一个类对象作为另一个类的成员,我如何初始化为安全的空状态
I have a class object as a member of another class, how do I initialize as a safe empty state?
我有两个类,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
对象成员。
相关文章:
- C++:用IIFE线程初始化静态局部变量安全吗
- 用非零值初始化void指针的正确(或最安全)方法
- 初始化期间针对安全检查的指针的恒定正确性
- VC++6 线程安全静态初始化
- 将类复制到未初始化的内存中是否安全?
- 为什么静态局部变量的 MSVC 线程安全初始化使用 TLS
- C 标准是否保证统一初始化是例外安全
- 是重构过程中结构安全的骨料初始化
- 定义,初始化全局const变量是安全的吗?
- C++多线程:是本地静态lambda线程安全的初始化
- 静态初始化不安全调用的线程安全
- 使用局部静态std :: ARNE_FLAG和局部静态指针对静态变量的线程安全初始化
- 移动初始化列表的元素是安全的吗?
- 使用之前在初始值设定项列表中初始化的成员初始化成员是否安全
- C++11:对延迟初始化进行安全的双重检查锁定.可能的
- 本地静态函数对象线程安全的初始化
- 用指向派生类的指针初始化auto_ptr是否安全
- 传递未初始化的变量安全
- 销毁未初始化的 FFTW 计划是否安全
- 如何在 C++11 中的函数内初始化线程安全静态常量向量