私が書こうとしているC++ライブラリに問題があります。通常のセットアップ、1つのcppファイル、1つのヘッダーファイルです。ヘッダーファイルには、使用する部分のみが公開されます(ヘッダーファイルには必要ない抽象基本クラスがあります)。これまでのところ、私はただ一つのファイルで作業しています(これは何の違いもないはずです、何も気にしないプリプロセッサによって行われます)。C++クラスの宣言と名前空間
「ヘッダーファイル」は、ヘッダー実装ファイルの前後に2箇所に広がっています。
#include <stdio.h>
// lib.h
namespace foo {
template <class T> class A;
}
// lib.cpp
namespace foo {
template <class T> class A {
private:
T i;
public:
A(T i) {
this->i = i;
}
T returnT() {
return i;
}
};
};
// lib.h
namespace foo {
template <class T> T A<T>::returnT();
}
// foo.cpp
void main() {
foo::A<int> a = foo::A<int>(42);
printf("a = %d",a.returnT());
}
だから、当然、私はちょうど
namespace foo {
template <class T> class A;
template <class T> T A<T>::returnT();
}
を含むように私のヘッダファイルを希望しかし、私のコンパイラは、この(それはreturnT
がfoo::A<T>
のメンバーではないと文句を言い。理由は私が好きではありません。クラス宣言そのものをヘッダーに入れたくないということは、私が理解しているように、プライベートなものとそれに類するものをすべて含んでいることです。私は隠したいものです。
多分それは私です。しかし、次のヘッダーファイルは少なくとも「悪い」と思われます"インターフェイス仕様"と呼ばれています。A
の内部構造の一部を公開していますが、libのユーザーはそれについて知る必要はありません。
// lib.h
namespace foo {
template <class T> class A {
private:
int i;
public:
A(T);
T returnT();
};
}
// lib.cpp
namespace foo {
template <class T> A<T>::A(T i) {
this->i = i;
}
template <class T> T A<T>::returnT() {
return i;
}
};
これは受け入れられる方法ですか?可能であれば、より抽象的なヘッダーファイルが必要です。
をヘッダファイルのコードコードの全体の最初のブロックですか? "lib.h"とラベルされた2つのブロックがあるので混乱していますが、そこに 'main'関数があります。 –
' template'という単語を書くときに、実装の詳細を公開しています。これはどのように動作するか、期間です。メインヘッダーに '#include 'という"実装ヘッダーファイル "を作ることができますが、ソースを出荷する必要があります。 –
@ James McNellis:最初のコード部分(灰色のブロック)は、すべてを1つのファイルに保存するために使用した単なるテストファイルです。これは、これが 'lib.h'、' lib.cpp'と 'main.cpp'の3つのファイルに分割され、最後は' user'テストだけで 'lib'を呼び出すという考え方です。問題はちょうど私が望むようなものを得るためには、私はヘッダーを実装コードの上の1つの部分とその下の1つの部分に分割する必要があるということです。それは理にかなっていますか? – Svend