c++ - 类中未初始化字段的值

标签 c++ class pointers return

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 和其他东西的选项......如果这本书的人真的是可选的,你可以制作一个指针(或者更好,一个 shared_ptr 或其他智能指针) person 成员使状态“person not set”成为可能,例如

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;
    }
};

不过,您必须使用 -> 访问该人的成员(例如,假设 person 有一个采用名称的构造函数和一个 getName 函数:) - 当然您会必须小心不要取消引用未设置的指针,就像使用原始指针一样(或者使用 Java 中的引用,在我看来你可能来自哪里?)。

Book b1;
// ... set Person ...
b1.setPerson(std::make_shared<Person>("John"));

然后您可以通过检查 std::shared_ptr 的默认 bool 运算符来检查是否设置了 person,如下所示:

// somewhere in Book class:
if (person) ...

2 “空”约定

为取消设置的人的含义制定一个约定(例如,当名称为空时,它是“默认”,即取消设置的人)。然后你可以简单地 checkin Book 类:

if (person.getName().empty()) ...

但是请注意,使用此选项时,当 Person 类更改时,您更有可能遇到问题,因为它现在与 Book 类紧密耦合。例如。在某些时候,您可能需要在构造时实际设置人名,您还必须更改 Book 中的逻辑。

关于c++ - 类中未初始化字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19362576/

相关文章:

c - 访问结构中结构的成员

c++ - 如何修复 boost/asio c++ 异常错误?

c++ - 网络 bean : Adding "Compile Line - Additional Options" "-lboost_system" at the end of compile command

java - 参数化类与参数化方法

c - 动态多维数组

c++ - 关于 C++ 中临时对象的确切销毁时间的问题

c++ - 计算 RotatedRect OpenCV 内白色像素的百分比

c++ - 多字符字符常量警告

java - 为什么这个 java 代码没有在 Eclipse IDE 上显示。公共(public)类型App必须在自己的文件中定义

class - 如何在类中使用 Jenkins 插件?