ページ 11

[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
なるほど、、、

私の読解力が足りなかったようです。(’・_・


ありがとうございました!
これで解決ということにします。