-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_personPersonフリー ストアにオブジェクトを作成し、そのオブジェクトのアドレスを返すグローバル関数です。その点で、それはまったく同じnew Person(whatever)であり、この文脈では完全に冗長です. この種の関数が便利なコンテキストがあるため、これはファクトリ関数の穏やかな紹介になる可能性があります。

于 2012-09-04T13:10:14.567 に答える
4

CreatePerson直接行うのではなく、関数を使用するイディオムはnew 、ファクトリ メソッド パターンと呼ばれます。仮想関数のないクラスに使用されることはほとんどありません。通常、呼び出し元のコードが抽象基本クラスのみを認識し、newed される可能性のある実際の型について何も知らない場合に使用されます。

于 2012-09-04T13:12:46.193 に答える
3

その機能について特別なことは何もありません。class PersonPerson全く同じタイプです。

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スタイル」だからでしょう。

于 2012-09-04T13:10:30.530 に答える