ページ 1 / 1
"文字列"でクラスのInstance作成
Posted: 2017年11月13日(月) 10:33
by ロード
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作成
Posted: 2017年11月13日(月) 11:44
by かずま
次のようにすると、新しいクラス 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;
}
}
}
Re: "文字列"でクラスのInstance作成
Posted: 2017年11月13日(月) 12:31
by ロード
ありがとうございます。Table化したら綺麗にはまとまりそうです。
ただし、出来れば完全なブラックボックスで運用出来るようにしたいのですが無理でしょうか?
プログラムでTableのプログラム書かせて再コンパイルかけると一応出来そうかなって妄想は出来ました。
どうにかまとまらないでしょうかね・・・