ページ 1 / 1
[c++] テンプレートクラスにおける処理の分離
Posted: 2017年2月19日(日) 14:09
by purin52002
初めまして
テンプレートクラスについて質問があります。
私は今までほぼすべてのコードをhファイルに書いてきました。
しかし、今回ちょっとした心境の変化でhファイルとcppファイルにコードを分割しようと思い立ちました。
しかしここで問題が。。。
テンプレートクラスを分離できないのです。
正確には分離後のコードが気にくわないのです。
コード:
//A.h
template<typename T>
class A{
private:
T x;
public:
T Add(T obj){return x+obj;}
}
これを分割したら
コード:
//A.h
template<typename T>
class A{
private:
T x;
public:
T Add(T obj);
}
コード:
//A.cpp
#include"A.h"
template<typename T>
T A::Add(T obj){return x+obj;}
となります(よね?)
どうしたもんかといろいろ探し回ったところ、以下のサイトを発見しました。
http://amagitakayosi.hatenablog.com/ent ... /03/184752
このサイトの下部では
「テンプレートクラスではデータだけ保持して、処理は別クラスに書く」
とあります。
しかし、この「別クラスに処理を書く」方法がわかりません。
ここで質問です。
別のクラスはどのような構成にすればいいのでしょうか?
そして、もしよろしければ上のAクラスを実際に分離してもらえないでしょうか?
よろしくお願いします<(_ _)>
Re: [c++] テンプレートクラスにおける処理の分離
Posted: 2017年2月19日(日) 14:39
by inemaru
別のクラスはどのような構成にすればいいのでしょうか?
こちらは、質問の意味がくみ取れませんでした。すいません。
(実装側のコーディング方法という意味であれば、後記のコードを参照)
そして、もしよろしければ上のAクラスを実際に分離してもらえないでしょうか?
こうじゃないですか?
コード:
//A.cpp
template<typename T>
T A<T>::Add(T obj){ return x + obj; }
後、ヘッダー側のセミコロンが抜けています。
コード:
//A.h
template<typename T>
class A{
private:
T x;
public:
T Add(T obj);
};
オフトピック
実際に使用するのであれば、初期化リストが必要なので、
コンストラクタ等で、xを初期化する必要があります。
Re: [c++] テンプレートクラスにおける処理の分離
Posted: 2017年2月19日(日) 15:03
by purin52002
inemaruさん、ご指摘ありがとうございます。
ちょっと適当に書きすぎました^^;
改めてAクラスを書き直します。
コード:
//A.h
template<typename T>
class A{
private:
T x;
public:
A();
T Add(T obj);
}
//A.cpp
#include"A.h"
template<typename T>
A<T>::A():x(0){}
template<typename T>
T A<T>::Add(T obj){return x+obj;}
こんな感じでどうでしょうか?^^;
つまりAクラスは
x->0、
Add(obj)->x+objを返す関数
ということで。。。
「テンプレートクラスにデータを保持、別のクラスに処理を書く」ということは、
コード:
//ヘッダ
template<typename T>
class A{
T x;//データを保持
}
//ソース
class B{
//どうにかしてAクラスのメンバにアクセスして処理を行う
//T Add(T obj){return obj+A::x} みたいなイメージ?
}
このようなイメージを私は持ってたんですけど。。。
Re: [c++] テンプレートクラスにおける処理の分離
Posted: 2017年2月19日(日) 15:35
by inemaru
purin52002 さんが書きました:
「テンプレートクラスにデータを保持、別のクラスに処理を書く」ということは、
コード:
//ヘッダ
template<typename T>
class A{
T x;//データを保持
}
//ソース
class B{
//どうにかしてAクラスのメンバにアクセスして処理を行う
//T Add(T obj){return obj+A::x} みたいなイメージ?
}
このようなイメージを私は持ってたんですけど。。。
(あくまで自分が読んだ限りの解釈ですが、)
記事の内容を見る限りだと、
「別クラス」と言っているのは、テンプレートクラスの実装の事を言っているように見えました。
A<型> の、「型」に入る内容が変わることで、別のクラスとして扱われる為
このような表現になっていると思われます。
Re: [c++] テンプレートクラスにおける処理の分離
Posted: 2017年2月19日(日) 15:46
by purin52002
なるほど、、、
私の読解力が足りなかったようです。(’・_・
ありがとうございました!
これで解決ということにします。