-1

我正在阅读“Learn C the Hard Way”一书,并在那里找到了一个看起来像这样的代码片段(下面是我的代码,但程序的结构是相同的):

#include <iostream>
#include <string>

using namespace std;

class Person {
private:
    string name;
    int age;
public:
Person(string name, int age) {;
        this->name = name;
        this->age = age;
    }


~Person() {
    }
};

// When whould I do like this?
class Person *Create_person(string name, int age) {
    class Person *person = new Person(name, age);
    return person;
};    

int main() {
    Person *person = Create_person("John", 30);
}

特别看

class Person *Create_person(string name, int age) {
        class Person *person = new Person(name, age);
        return person;
    };

那是什么样的功能?为什么我会这样称呼它,而不仅仅是Person *person = new Person?它是一个简短的形式

class Person {
public:
   Person *Create_person(string name, int age){
        Person *person = new Person(name, age);
        return person;
   }
}

?

4

4 回答 4

5

Create_person是一个全局函数,它在空闲存储上创建一个Person对象并返回该对象的地址。在这方面,它完全一样new Person(whatever),在这种情况下,完全是多余的。在某些情况下这种函数很方便,所以这可能是对工厂函数的简单介绍。

于 2012-09-04T13:10:14.567 回答
4

使用CreatePerson函数而不是new 直接执行的习惯称为工厂方法模式。很少看到它用于没有虚函数的类。new它通常在调用代码只看到一个抽象基类,并且对可能被编辑的实际类型一无所知时使用。

于 2012-09-04T13:12:46.193 回答
3

该功能没有什么特别之处。class Person并且Person是完全相同的类型。

class Person *Create_person(string name, int age) {
    class Person *person = new Person(name, age);
    return person;
};

Person *Create_person(string name, int age) {
    Person *person = new Person(name, age);
    return person;
};

意思相同。无论如何,该功能似乎毫无意义,您可以直接调用new Person(name, age),正如您已经想到的那样。

于 2012-09-04T13:10:35.247 回答
1
class Person *Create_person(string name, int age) {
        class Person *person = new Person(name, age);
        return person;
    };

是全局命名空间中的一个函数,它返回一个指向Person对象的指针。这里class不需要关键字,可以省略。实际上,它应该被省略。它存在的原因可能是因为它是“C-style”。

于 2012-09-04T13:10:30.530 回答