3

基本クラスとそこから派生した複数のクラスがあります。各派生クラスには、基本クラスで初期化されたパラメーターを受け入れるコンストラクターがあります。すべてのコンストラクターは異なりますが、それらはすべて 1 つの共通パラメーターを受け入れます。それを と呼びましょうName

すべての派生クラスの名前を次々に呼び出すよりも短い方法で表示する方法はありますか?

例を次に示します。私の基本クラスがFatherあり、派生クラスがBrother, Sister, HalfBrother, HalfSisterあり、これが私のドライバーファイルであるとしましょう:

cout << Brother::Brother().getName() << endl
     << Sister::Sister().getNAme() << endl
     << HalfBrother::HalfBrother().getNAme() << endl
     << HalfSister::HalfSister().getName() << endl;

これはそれらを正常に返しますが、これを行うより簡単な方法はありますか?

4

2 に答える 2

1

クラスの静的レジストリを作成し、登録したいクラスに挿入する静的メンバーのコンストラクターからデータを取り込むことができます。

ヘッダー内:

class Registration {
    static vector<string> registered;
public:
    static void showRegistered() {
        for (int i = 0 ; i != registered.size() ; i++) {
            cout << registered[i] << endl;
        }
    }
    Registration(string name) {
        registered.push_back(name);
    }
};

CPP ファイル内:

vector<string> Registration::registered;

このクラスを使用すると、次のことができます。

ヘッダーで:

class A {
    static Registration _registration;
};

class B {
    static Registration _registration;    
};

class C {
    static Registration _registration;    
};

CPP ファイル内:

Registration A::_registration("quick");
Registration B::_registration("brown");
Registration C::_registration("fox");

この最後の部分が重要です。静的変数の宣言には_registration副作用があります。特定の順序でなくvector<string> registeredRegistrationクラスの に名前を挿入します。名前を取得したり、印刷したり、好きなように処理したりできます。印刷用のメンバー関数を追加しましたが、明らかに制限はありません。

ここに ideone のデモがあります- 印刷されます

quick
brown
fox
于 2012-11-12T03:25:34.213 に答える
0

正直なところ、あなたの質問を理解しているかどうかわかりません。コメントで述べたように、 getName() を父のメソッドにする必要があります。

class Father {
public:

    Father(string name) : m_name(name) {
    }

    string& getName() {
        return m_name;
    }

private:
    string m_name;
};

class Brother : public Father {
public:
    Brother(string name) : Father(name) {
    }
};

class Sister : public Father {
public:
    Sister(string name) : Father(name) {
    }
};

したがって、次のようなものを使用できます。

vector<Father *> fathers;
Brother brother("...");
Sister sister("....");

father.push_back(&brother);
father.push_back(&sister);

for (vector<Father*>::iterator itr = fathers.begin();
        itr != fathers.end();
        ++itr) {
    cout << (*itr)->getName() <<endl;
}
于 2012-11-12T03:37:32.773 に答える