2017-09-14 6 views
0

クラスAとクラスBの2つのクラスがあります。どちらもインスタンス化する必要があるため、パラメータ付き。しかし、クラスBの内部にクラスAのオブジェクトを作成することはできません。デフォルトのパブリックコンストラクターを使用せずにクラスをインスタンス化することはできません。C++ポインタを持たない別のクラスコンストラクタ内にデフォルトのコンストラクタを持たないオブジェクトをインスタンス化する

これは私の設定です:オブジェクトの

クラスIは、他のクラスBの内部で初期化しようとしています:

ClassA.h

Class A //No default constructor 
{ 
public: 
    A(int var1, int var2); //Class A's Constructor 
} 

私は、このオブジェクトのインスタンスを作成したいですそれはクラスBをインスタンス化するときにインスタンス化されます。クラスAにインスタンス化するためにクラスBに渡された値が必要なためです。

ClassB.h

Class B //No default Constructor 
{ 
public: 
    A myClassA; //The public variable in class B I want to hold an object of class A 

    int somePublicVar; 

    B(int var1, int var2, int var3); //Class B's Constructor 

} 

タイプAのmyClassAオブジェクトがインスタンス化されないようです。

ClassB.cppは

B::B(int var1, int var2, int var3) 
{ 
    B = A(var1, var2); 
    somePublicVar = var3 

} 

は、私はC++に新しいですが、私はC#とCと非常によく知ってしかし、私はこれを完了するために右の構文/プロセスを見つけるように見えることはできません。

この問題に関連する質問をもっと読むほど、これを達成するためにポインタを使用する方が、オブジェクトを手動で破棄する必要があるため、この問題を解決するための「初心者」の方が多いようですポインタなしでこれを行う。出来ますか?このプロセスのベストプラクティスは何ですか?

私が代わりにオブジェクトのポインタとしてAを定義した場合、私はこれを行うとき、私はエラーを取得するので、私はこれを達成するために必要がある場合、私はポインタに頼るだろうが、私はあまりにもその操作に苦しんでいます:

myClassA = & A(var1、var2);

私は "A(var1、var2)"のスコープがコンストラクタであり、コンストラクタが完了した後に削除されることを理解しているので、 "非標準拡張が使用されます:クラス値は左辺値として使用されます"それへのポインタを保存します。だから私はこの場合でもポインタのアプローチをどのように利用するのかはわかりません。

私はこの質問に対する部分的な回答しか見つけられないようですが、いずれもすべての条件を満たすとは思われません。私は助けに感謝します。

編集9/14/17:

私はまた、どのように私は防ぐことができ、私はデフォルトコンストラクタを持っていない場合は、クラスBの内部パブリック変数としてmyClassAを持ってしようとしていますことを言及するのを忘れてしまいましたこれは私に "No Default Constructor"エラーを出すことからですか?上記

答えて

4
B::B(int var1, int var2, int var3) : myClassA(var1, var2) 
{} 
+0

ありがとうございます。私はこのような迅速な返答を申し立てます。しかし、myClassAをクラスBの中のpublic変数としてどのように定義できますか?それは私にデフォルトのコンストラクターエラーを与え続けます。 – WhatIsASyntax

+0

@WhatIsASyntaxエラーではありません。 'A'のデフォルトのコンストラクタを呼び出そうとする可能性のある場所をすべて確認してください。ライブの例ですが、出力にコンパイラエラーは表示されません:http://coliru.stacked-crooked.com/a/d94463408244b094 –

+0

@WhatIsASyntax 'A'へのポインタを' B'のメンバとして使いたい場合は、次のようなことができます: 'class B {unique_ptr p; B :: B(int var1、int var2、int var3){p = make_unique (var1、var2);} '。 – AlexD

1

アレックスの説明はここではもちろん正しいのですが、高度に

-Thanksはあまりにもあなたのためのリンクです:http://en.cppreference.com/w/cpp/language/initializer_list

基本的に、それはだ場合「の後に:しかし、コンストラクタ本体の前に」それらの引数で「構築」されます。デフォルトコンストラクタは呼び出されません。また、デフォルト以外のコンストラクタしか定義していないため、class Aには引数のないコンストラクタはありません。

+0

ありがとうございました。これははるかに理にかなっています!私はAlexDの答えが公的変数宣言をどのようにして得られたのか理解できませんでしたが、これはすべてを説明しています。ありがとうございました。 – WhatIsASyntax

関連する問題