ヘッダーファイルのみで構成されるライブラリを開発しています。これまでのところ、クラスのみが含まれていますが、問題ありません。ただし、一部の関数を実装するには、ライブラリ内にライブラリ全体でアクセス可能な不変のデータ(つまり、クラスインスタンスデータではない)が必要になるようになりました。明らかに、グローバルデータをヘッダーファイルに入れることはできません。そうしないと、ヘッダーであるすべて#include
のコンパイルユニットにシンボルの定義があり、リンク時に複数の定義エラーが発生します。
static
関数内のデータを変数にしてそのデータへのポインターを返すだけで、ライブラリにコンパイルユニットを追加しなくても、クラスに静的データを含めることができる回避策を見つけたようです。
class StaticData {
public:
void doSomething() { /* this uses getData */ }
void doSomethingElse() { /* this does too */ }
private:
static int* getData() {
static int array[] { 1, 2, 3, 4 };
return array;
}
};
これは正常に機能しているように見えますが、ヘッダーファイルstatic
の関数の関数データがどうなるかわからないことを認めなければなりません。inline
この「ハック」には、#include
このヘッダーが独自のバージョンのを取得するすべてのコンパイルユニットなど、意図しない影響があるのではないかと思いarray
ます。コンパイラはどのようにそしてどこにそれを置くことを決定しますか?
また、これをシングルトンアンチパターンなどの実装に使用していないことにも注意してください。複数の関数が使用する必要のあるデータを格納するために使用しているだけです(そのため、それを使用する関数だけに含めることはできませんがstatic
、使用したとしても、同じ質問が表示されます)。