【问题标题】:Value of an uninitialized field in class类中未初始化字段的值
【发布时间】:2025-12-14 10:45:01
【问题描述】:
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 不正确。

谢谢!

【问题讨论】:

  • Book 有一个默认构造的 Person。是一个对象,不太可能和NULL相提并论,NULL是用来表达空指针的。
  • 要添加到@juanchopanza,您的Book 构造函数应该包含以某种方式调用和初始化Person 构造函数的逻辑。
  • 这就是你在 JAVA 中要做的事情。在 C++ 中,如果你不将某些东西声明为指针,你也不能将 NULL 分配给它。 person 不是你的类中的指针,而是你的 book 类直接包含 person 对象,因此它也不能是 ull
  • 非常感谢大家!

标签: c++ class pointers return


【解决方案1】:

您至少有两个选择:

1 使用指针

这就是你似乎想要使用 NULL 和其他东西的选项......如果这本书的人真的是可选的,你可以制作一个指针(或者甚至更好,一个 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;
    }
};

您必须使用 -> 访问该人的成员(例如,假设 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“空”约定

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

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

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

【讨论】:

    【解决方案2】:

    如前所述,将调用 Person 类的默认构造函数。 如果您没有编写自己的构造函数(将调用默认构造函数)并且没有在构造函数中初始化实例的任何成员,则成员将包含发生内存分配时内存中的值。

    在这种情况下,它将只包含堆栈上的垃圾(因为它是在堆栈上分配的。)

    【讨论】:

      【解决方案3】:

      它将返回 Person 的默认构造函数创建的任何内容。

      【讨论】:

        【解决方案4】:
        class Book
        {
        private:
            Person p1;
        public:
            Book()
            { }
        
            friend bool operator== (const Book& b, const Person& p)
            {
                return &b.p1 == &p;
            }
        };
        

        【讨论】: