[c++] テンプレートクラスにおける処理の分離

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
purin52002

[c++] テンプレートクラスにおける処理の分離

#1

投稿記事 by purin52002 » 2年前

初めまして

テンプレートクラスについて質問があります。


私は今までほぼすべてのコードを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クラスを実際に分離してもらえないでしょうか?


よろしくお願いします<(_ _)>

inemaru
記事: 108
登録日時: 3年前

Re: [c++] テンプレートクラスにおける処理の分離

#2

投稿記事 by inemaru » 2年前

別のクラスはどのような構成にすればいいのでしょうか?
こちらは、質問の意味がくみ取れませんでした。すいません。
(実装側のコーディング方法という意味であれば、後記のコードを参照)
そして、もしよろしければ上の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を初期化する必要があります。

アバター
purin52002
記事: 235
登録日時: 2年前
連絡を取る:

Re: [c++] テンプレートクラスにおける処理の分離

#3

投稿記事 by purin52002 » 2年前

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}   みたいなイメージ?
}
このようなイメージを私は持ってたんですけど。。。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

inemaru
記事: 108
登録日時: 3年前

Re: [c++] テンプレートクラスにおける処理の分離

#4

投稿記事 by inemaru » 2年前

purin52002 さんが書きました: 「テンプレートクラスにデータを保持、別のクラスに処理を書く」ということは、

コード:

//ヘッダ
template<typename T>
class A{
    T x;//データを保持
}

//ソース
class B{
//どうにかしてAクラスのメンバにアクセスして処理を行う
//T Add(T obj){return obj+A::x}   みたいなイメージ?
}
このようなイメージを私は持ってたんですけど。。。
(あくまで自分が読んだ限りの解釈ですが、)
記事の内容を見る限りだと、
「別クラス」と言っているのは、テンプレートクラスの実装の事を言っているように見えました。

A<型> の、「型」に入る内容が変わることで、別のクラスとして扱われる為
このような表現になっていると思われます。
最後に編集したユーザー inemaru on 2017年2月19日(日) 15:46 [ 編集 1 回目 ]

アバター
purin52002
記事: 235
登録日時: 2年前
連絡を取る:

Re: [c++] テンプレートクラスにおける処理の分離

#5

投稿記事 by purin52002 » 2年前

なるほど、、、

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


ありがとうございました!
これで解決ということにします。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

閉鎖

“C言語何でも質問掲示板” へ戻る