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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: "文字列"でクラスのInstance作成

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

#3

by ロード » 6年前

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

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

#2

by かずま » 6年前

次のようにすると、新しいクラス 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;
        }
    }
}

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

#1

by ロード » 6年前

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;
このように書けば出来ないことは無いのですが増えたときに管理が面倒になってしまいます。

ページトップ