C ++でネストされたクラスのコンストラクタを初期化する方法

ネストされたクラスのコンストラクタを初期化する際に問題が発生しています。

ここに私のコードです:

#include 

using namespace std;

class a
{
public:
class b
{
    public:
    b(char str[45])
        {
        cout<

私が得るエラーは次のとおりです。

  fun.cpp:21:30:エラー: '(a :: b)'の呼び出しに一致しません
 
4
@OliCharlesworth fun.cpp:21:30:error: '(a :: b)'への呼び出しに一致しません
追加された 著者 sandbox,
エラーメッセージとは何ですか?
追加された 著者 Oliver Charlesworth,

4 答え

あなたはおそらく次のようなものが必要でしょう:

class a
{
public:
    a():title(b("")) {}
    //....
};

title はすでに a のメンバーですが、デフォルトコンストラクタはありません。デフォルトのコンストラクタを記述するか、初期化リストに初期化します。

6
追加された

この:

document.title("Hello World");

「ネストされたクラスを初期化する」ではありません。オブジェクトに対して operator()を呼び出そうとしています。

document を作成すると、ネストされたオブジェクトは既に初期化されています。あなたがデフォルトコンストラクタを提供していないので、そうでないことを除いて。

1
追加された

データメンバをポインタにするか、データメンバのコンストラクタをメンバであるクラス(この場合は a )のコンストラクタの初期化子リストからのみ呼び出すことができます

1
追加された

だからあなたはここに何を持っていますか?

class A {
  B title;
}

Without defining constructor for class A (as Luchian Grigore shown) title will be initialized as: B title();

あなたはその周りでそれを動作させることができます:

A::A():title(B("Hello world"))

// Or by adding non parametric constructor:
class B {
  B(){

  }

  B( const char *str){

  }
}

operator()を宣言して定義することで、 document.title(...)の構文を使用することができます。これはコンストラクタではありません:

class B {
  const B& operator()(const char *str){
     cout << str;
     return *this;
  }
}
0
追加された