类中未初始化字段的值

时间:2013-10-14 14:28:56

标签: 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不正确。

谢谢!

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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;
    }
};

您必须使用 - &gt;访问该人的成员然后虽然(例如,让我们假设一个人有一个构造函数取名,一个getName函数:) - 当然你必须小心不要取消引用一个未设置的指针,就像原始指针一样(或者使用Java中的引用,我觉得你可能来自哪里?)。

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

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

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

2“空”惯例

为一个人未设置意味着制定约定(例如,当名称为空时,它是“默认”,即未设置的人)。然后你可以简单地检查Book类:

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

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

答案 2 :(得分:0)

它将返回Person创建的默认构造函数。

答案 3 :(得分:0)

class Book
{
private:
    Person p1;
public:
    Book()
    { }

    friend bool operator== (const Book& b, const Person& p)
    {
        return &b.p1 == &p;
    }
};