ライブラリを利用するユーザの開発環境に提供するライブラリのheaderファイルは
必ずしもそのライブラリを実装するに利用するheaderとまったく同じにする必要はないですね?
例えば、classの[private]部分をユーザに提供するheaderファイルから削除しても理論上問題ない?
ご教授お願いします
C++言語のheaderファイルについて
Re: C++言語のheaderファイルについて
ヘッダーファイルを同一にする必要は無いですが,クラスの構造は同じにする必用があります。
クラスの構造とは,基底クラスの宣言の順序,メンバ変数の宣言の順序、仮想関数の宣言の順序などです。
public/protected/privateの順序を入れ替える,などもやってはいけません。
現実的な問題点としては,クラスの宣言を元にコンパイラは必要なメモリの量を決定するため,private変数を削るとコンパイラはメモリの量を少なく見積もってしまう,ということがあります。
結果として,変数へのアクセスが確保していないメモリへのアクセスになる可能性がでてきます。
クラスの構造とは,基底クラスの宣言の順序,メンバ変数の宣言の順序、仮想関数の宣言の順序などです。
public/protected/privateの順序を入れ替える,などもやってはいけません。
現実的な問題点としては,クラスの宣言を元にコンパイラは必要なメモリの量を決定するため,private変数を削るとコンパイラはメモリの量を少なく見積もってしまう,ということがあります。
結果として,変数へのアクセスが確保していないメモリへのアクセスになる可能性がでてきます。
Re: C++言語のheaderファイルについて
さっそくお返答ありがとうございます。
>public/protected/privateの順序を入れ替える,などもやってはいけません。
確か自分に以前この辺にかかる問題が起きた事があったような記憶がありますが、
具体にどういうわけ分かりませんでした。
理由を教えていただけませんか。
>public/protected/privateの順序を入れ替える,などもやってはいけません。
確か自分に以前この辺にかかる問題が起きた事があったような記憶がありますが、
具体にどういうわけ分かりませんでした。
理由を教えていただけませんか。
Re: C++言語のheaderファイルについて
ちゃんと調べ直したところ,ちょっと古いですが,
これを勘違いしていたようです。
ただ,割り当て順が変わればパディングが変わる可能性があるため,クラスのサイズが変化する可能性は十分あり得ます。
もし,目的がクラスの実装を見せたくない,やヘッダファイルの参照が深くなることが問題,といったことならpimplイディオム使うなどして隠すという方法を使うのがよいかと思います。
という記述がありました。ISO/IEC 14882:2003 さんが書きました:11 Member access control - 11.1 Access specifiers
2 The order of allocation of data members with separate access-specifier labels is unspecified
これを勘違いしていたようです。
ただ,割り当て順が変わればパディングが変わる可能性があるため,クラスのサイズが変化する可能性は十分あり得ます。
もし,目的がクラスの実装を見せたくない,やヘッダファイルの参照が深くなることが問題,といったことならpimplイディオム使うなどして隠すという方法を使うのがよいかと思います。