类中未初始化字段的值
Value of an uninitialized field in class
class Person {
.....
}
class Book {
string title;
Person person;
....
Person getPerson() {
return person;
}
....
}
int main() {
Person p1;
Book b1;
b1.setPerson(p1);
b1.getPerson();
}
我的问题是 b1 中 person 的值是什么,b1.getPerson() 返回什么?如何检查该字段是否有值?我想检查这本书是否有指定的人员,如果没有,则分配一个人。
bool isPerson(Person _person, Book _book) {
if (_book.getPerson() == NULL) {
_book.setPerson(_person);
return true;
}
else {
return false;
}
这就是我想做的,但是==NULL不正确。
谢谢!
您至少有两个选项:
1 使用指针
这就是您似乎想要使用 NULL 和其他东西的选项......如果这本书的人真的是可选的,你可以从 Person 成员中创建一个指针(甚至更好的是,一个shared_ptr或其他一些智能指针),以便能够获得状态"人未设置",例如
class Book {
string title;
std::shared_ptr<Person> person;
void getPerson(std::shared_ptr<Person> p) {
return person = p;
}
std::shared_ptr<Person> getPerson() {
return person;
}
};
你必须使用 -> 访问那个人的成员(例如,假设一个人有一个构造函数取名,还有一个getName
函数:) - 当然,你必须小心不要取消引用未设置的指针,就像原始指针一样(或者 Java 中的引用,在我看来你可能来自哪里?
Book b1;
// ... set Person ...
b1.setPerson(std::make_shared<Person>("John"));
然后,您只需检查 std::shared_ptr 的默认布尔运算符即可检查是否设置了 person,如下所示:
// somewhere in Book class:
if (person) ...
2 "空"约定
制定一个约定,说明一个人未设置的含义(例如,当名字为空时,它是"默认",即未设置的人)。然后,您只需签到书类:
if (person.getName().empty()) ...
但请注意,使用此选项,当您的Person
类更改时,您更有可能遇到问题,因为它现在紧密耦合到Book
类中。 例如,在某些时候,您可能需要在构造中实际设置人名,您还必须更改 Book 中的逻辑。
如前所述,将调用 Person 类的默认构造函数。如果您没有编写自己的构造函数(将调用默认构造函数),并且没有在构造函数中初始化实例的任何成员,则成员将包含发生内存分配时内存中的值。
在这种情况下,它将只包含堆栈上的垃圾(因为它是在堆栈上分配的)。
它将返回Person
创建的任何默认构造函数。
class Book
{
private:
Person p1;
public:
Book()
{ }
friend bool operator== (const Book& b, const Person& p)
{
return &b.p1 == &p;
}
};
- 聚合初始化和删除的复制构造函数,也称为不可复制的 obejcts 作为字段
- 类内非静态字段初始化 + 对象池 - >降低可维护性/可读性
- 为什么 MSVC 和 GCC 不能使用具有默认值的字段初始化结构
- 隐式字段初始化的规则
- 在 Qt 创建器中禁用 -wmissing 字段初始值设定项警告
- 初始化构造函数中的字段-初始化器列表与构造函数正文
- C++中模板类中的静态字段初始化
- 构造函数中的字段初始化会损坏内存
- 如何从字符串字面值初始化无符号字符数组
- c++ 11统一初始化:字段初始化不是常量
- 非阻塞TCP套接字在初始化时挂起(c++)
- 在c++中使用浮点字面值初始化整型数组的成员
- 用字符串字面值初始化char *类成员
- Int数组给出疯狂的值,除非所有字段初始化为0,为什么?
- 从字符串字面值初始化字符数组是否属于数组复制初始化的情况?
- 关于 VC++ 和 Sun Studio 中的字段初始化顺序、签名比较和未使用的变量的警告
- 结构可以在方法主体中声明,但前提是它不包含成员字段初始值设定项。编译器错误与否?
- 如何在构造函数中禁用字段初始化
- 通过设置为字符串字面值初始化的c++大小的char数组会导致数组边界溢出
- 空的大括号init列表会发出关于缺少字段初始值设定项的警告