質問
私が作り出してしまおうというものの適切なヘッダファイルを含まない多くの他のファイルもしく清潔な新しいパスワードを入力してくだコンパイルす。
に出会った二つの問題このよう:
進宣言"を基底クラスでやらねばならない。
class B; class A : public B { // ... }
進宣言STD授業の方法でやらねばならない。
namespace std { class string; } class A { string aStringToTest; }
い方は、これらの問題を解決?
解決
最初の問題は、あなたが解決することはできません。
第二の問題は、標準ライブラリのクラスとは何ではありません。あなたがあなた自身のクラスのメンバーとしてクラスのインスタンスを宣言するためにです。
両方の問題は、コンパイラはその定義からクラスの合計サイズを見つけることができなければならないという要件に起因するものである。
しかし、コンパイラは、まだそれの完全な定義を持っていない場合でも、クラスへのポインタのサイズをうまくすることができます。だから、このような場合には可能な解決策は、かかるクラスのポインタ(または参照)の部材を有することである。
あなたが得ることはありませんので、基底クラスの場合はあまり助けには、関係「である」。
また、それはstd::string
のような何かをやって価値があります。まず、そう単純なもので、メモリ管理を行うことからあなたを救うために、文字バッファの周りに便利なラッパーことになっています。あなたは単にヘッダを含む避けるために、それへのポインタを保持する場合は、おそらくすぎて良いアイデアを取っている。
次に、std::string
はstd::basic_string<char>
するのtypedefです。だからではなく、それによって時間物事は非常に読み曖昧とハードになっており、コストの別の一種であることを宣言を転送する(してから使用)する必要があります。それは本当に価値がある?
他のヒント
としての答えは前よEarwickerできませんのみを使宣言の例としてコンパイラのニーズをお知りになサイズのクラスです。
のみ使用することができ進宣言の設定操作
- を宣言する機能を宣言されたクラスのパラメータとしてはそれを返します
- 宣言の会員のポインタまたは参照のみを宣言したクラス
- を宣言する静的変数として宣言された型のクラス定義
利用できませんで
- を宣言するのに会員の属性の指定されたタイプ(コンパイラを必要サイズ)
- 定義またはオブジェクトの作成、削除してください
- 他の静的、メンバーメソッドのクラスまたはアクセス会員または静的属性
なのか、忘れてしまった。)
ることが考慮されている宣言する auto_ptr
はと同じではありません宣言の原ポインタが、 auto_ptr
インスタンス生成に努め削除のポインタでの範囲及び削除を完了の宣言の型です。をご利用の場合は auto_ptr
に開催進宣言された型で提供するデストラクタ((空の場合も)を定義した上で、クラスの宣言を見たことがあります。
このほかにも、微妙.時のご来場を心よりお待ち申し上げを宣言するクラスは、ほとんどのコンパイラこれらのクラスです。することはできません、 enum
または typedef
別タイプです。これが問題だってなったとき、前進宣言 std::string
, ではtypedefの特定のインスタンス生成のテンプレート:
typedef basic_string<char> string; // aproximate
して文字列を宣言するのにする必要があることを宣言 basic_string
テンプレートを作成して、 typedef
.問題は、標準的な状態の数をパラメータ basic_string
テンプレート間において、国がその場で複数のパラメータが他のパラメータはデフォルトのタイプの発現は上記統.であることを確認するとともに標準的な方のための前進宣言のテンプレートを作成します。
れば、いみを宣言するのに非標準のテンプレート(STL)に行うことができるのでどんの人数をお知らのパラメータ:
template <typename T, typename U> class Test; // correct
//template <typename T> class Test; // incorrect even if U has a default type
template <typename T, typename U = int> class Test {
// ...
};
最後に、相談したから与えられたRoddy:みを宣言することだけが全てではないのですが、ことも想定されるものにしなければなりません。
あなたは、実際の問題ではない何かを解決するためにあまりにもハードしようとしています。必要なヘッダファイルを使用し、削減 - 可能な場合 - それらの要件を。あなたが失敗しますので、しかし、試してみて、極端にそれを取ることはありません。
いくつかのケースでは、PIMPLイディオムは、ここであなたを助けますが、ないかもしれません。
両方のケースでは、コンパイラは、型のサイズを知る必要があります。そのため、前方宣言は十分ではありません。基底クラスは、メンバーを追加したり、仮想テーブルを必要とする可能性があります。文字列メンバーは、STL文字列クラスのサイズを保存するために増加されるクラスの大きさが必要になります。
実装は、一般的に、コンパイルをスピードアップする明示的なテンプレートのインスタンスが含まれるので、フォワードSTLクラスを宣言することは、多くの場合、お勧めできません。
ごベースの授業が必要になりますの型定義だけではなくなります。派生型ヘッダーが必要#などのヘッダーベース。
授業のstd名前空間を含めなければなりません、適切なヘッダ <string> この場合には、そのいずれかの操作を行います3のもの:
完全予選のタイプ:std::string aStringToTest
けを宣言だけで このタイプ:使用std::string
入れを使用の宣言 std名前空間:using namespace std;
>前方宣言は、ベースクラスとSTLクラスの役に立たないと思われます。
修正... 前方宣言は、ベースクラスとオブジェクトのメンバーのために不適切です。 (それは、それが "不適当" である "役に立たない" ではありません。)
基底クラスが別のクラスのベースクラスとして宣言される場合(宣言転送しない)宣言する必要があります。
別のクラスによって、またはパラメータとして、または戻り値として宣言された場合にオブジェクト部材(前方宣言されていない)と宣言しなければなりません。注:参照するかによって、ポインタという制約を持っていません。
。修正... STLクラスの前方宣言がある - のISO 14882に従って - 未定義の動作。 http://www.gotw.ca/gotw/034.htmする