合計 昨日 今日

c++における自己参照的なクラスに関して

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: efa
[URL]
Date: 2017年1月09日(月) 21:54
No: 1
(OFFLINE)

 c++における自己参照的なクラスに関して

次に示すコードは実行できます。(5回文章が出力されます。)
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
template <class T> class DimClass{
public:
    DimClass<T>* ptr;
    DimClass(int dim){
        std::cout << "Constructor (" << dim << ")\n";
        if(dim>1) ptr = new DimClass<T>(dim-1);
    }
};
 
int main(void){
    DimClass<int> test(5);
    return 0;
}


しかし、このDimClassをこう変更するとコンパイルエラーになります。
確かにこのクラスはポインタの自己参照?を行ってはいるのですが、一定の値で止まるようにはなっています。
c++において、このようなことは不可能なのでしょうか。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
template <class T> class DimClass{
public:
    DimClass<T*>* ptr;
    DimClass(int dim){
        std::cout << "Constructor (" << dim << ")\n";
        if(dim>1) ptr = new DimClass<T*>(dim-1);
    }
};

(STLのような配列を実現する際、このように設計してみようと考えました。示しているコードは問題の部分を抜粋しています。)
ご教授お願いします。

Name: YuO
[URL]
ハッカー(150,031 ポイント)
Date: 2017年1月09日(月) 23:04
No: 2
(OFFLINE)

 Re: c++における自己参照的なクラスに関して

efa さんが書きました:しかし、このDimClassをこう変更するとコンパイルエラーになります。
確かにこのクラスはポインタの自己参照?を行ってはいるのですが、一定の値で止まるようにはなっています。
c++において、このようなことは不可能なのでしょうか。

メンバ変数で使われているため,newするかどうかに関わらずDimClass<T*>はインスタンス化されます。
このため,コンパイラはDimClass<int>からDimClass<int *>, DimClass<int **>……と無限に作ろうとして,当然ながら限界になってエラーになります。

このような場合は,テンプレートの部分特殊化を使うのが一般的かと思います。
コード[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
#include <iostream>
 
template <typename T, int N> class DimClass{
public:
    DimClass<T *, N - 1> * ptr;
    DimClass() {
        std::cout << "Constructor (" << N << ")\n";
        ptr = new DimClass<T *, N - 1>();
    }
    ~DimClass() { delete ptr; }
};
 
template <typename T> class DimClass<T, 0> {
public:
    DimClass() {
        std::cout << "Constructor (" << 0 << ")\n";
    }
};
 
int main(void) {
    DimClass<int, 5> * test = new DimClass<int, 5>();
    delete test;
    return 0;
}

Name: efa
[URL]
Date: 2017年1月10日(火) 22:02
No: 3
(OFFLINE)

 Re: c++における自己参照的なクラスに関して

[解決!]

なるほど…
テンプレートに引数を追加し、部分特殊化をすると可能なんですね。
これでできそうです。有難うございます!


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

オンラインデータ

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