合計 昨日 今日

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

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: ロード
[URL]
ぴよぴよ(617 ポイント)
Date: 2017年11月13日(月) 10:33
No: 1
(OFFLINE)

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

C++環境で文字列を使って型の宣言をしたいと思っています。
具体的にどのように使いたいかを上げると
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
}


こんな風に文字列を扱いたいのですが良さそうな方法が思いつきません。

コード[C++]: 全て選択
1
2
if(name == "child1") a = new child1;
else if(name == "child2") a = new child2;


このように書けば出来ないことは無いのですが増えたときに管理が面倒になってしまいます。

Name: かずま
[URL]
Date: 2017年11月13日(月) 11:44
No: 2
(OFFLINE)

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

次のようにすると、新しいクラス child4 を
定義した時、table に 1行追加するだけで、
コードの他の部分を変更する必要はありません。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#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;
        }
    }
}

Name: ロード
[URL]
ぴよぴよ(617 ポイント)
Date: 2017年11月13日(月) 12:31
No: 3
(OFFLINE)

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

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


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[8人]