"文字列"でクラスのInstance作成

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ロード
記事: 12
登録日時: 2年前

"文字列"でクラスのInstance作成

#1

投稿記事 by ロード » 7ヶ月前

C++環境で文字列を使って型の宣言をしたいと思っています。
具体的にどのように使いたいかを上げると

コード:

class parent{};
class child1 : public parent{};
class child2 : public parent{};
class child3 : public parent{};

int main()
{
	string name = "child1";
	//child1が作成される
	parent *a = new name;
	
	name = "child2";
	//child2が作成される
	a = new name;
}
こんな風に文字列を扱いたいのですが良さそうな方法が思いつきません。

コード:

if(name == "child1") a = new child1;
else if(name == "child2") a = new child2;
このように書けば出来ないことは無いのですが増えたときに管理が面倒になってしまいます。

かずま

Re: "文字列"でクラスのInstance作成

#2

投稿記事 by かずま » 7ヶ月前

次のようにすると、新しいクラス child4 を
定義した時、table に 1行追加するだけで、
コードの他の部分を変更する必要はありません。

コード:

#include <iostream>
#include <string>
using namespace std;

class parent {
public:
    virtual string name() const { return "parent"; }
};

class child1 : public parent { 
public:
    static parent *create() { return new child1; }
    string name() const { return "child1"; }
};
 
class child2 : public parent { 
public:
    static parent *create() { return new child2; }
    string name() const { return "child2"; }
};
 
class child3 : public parent { 
public:
    static parent *create() { return new child3; }
    string name() const { return "child3"; }
};
 
struct Table {
    string name;
    parent *(*create)();
};

Table table[] = {
    { "child1", child1::create },
    { "child2", child2::create },
    { "child3", child3::create },
};
const int table_size = sizeof(table) / sizeof(table[0]); 

int main()
{
    while (1) {
        string name;
        parent *a = nullptr;
        cout << ">> ";
        cin >> name;
        if (!cin) break;
        int i;
        for (i = 0; i < table_size; i++)
            if (table[i].name == name) break; 
        if (i < table_size)
            a = table[i].create();
        else
            cout << "unkonwn name\n";
        if (a) {
            cout << a->name()<< endl;
            delete a;
        }
    }
}

ロード
記事: 12
登録日時: 2年前

Re: "文字列"でクラスのInstance作成

#3

投稿記事 by ロード » 7ヶ月前

ありがとうございます。Table化したら綺麗にはまとまりそうです。
ただし、出来れば完全なブラックボックスで運用出来るようにしたいのですが無理でしょうか?
プログラムでTableのプログラム書かせて再コンパイルかけると一応出来そうかなって妄想は出来ました。
どうにかまとまらないでしょうかね・・・

返信

“C言語何でも質問掲示板” へ戻る