Как инициализировать конструктор вложенного класса в C ++ - PullRequest
4 голосов
/ 06 февраля 2012

У меня проблемы с инициализацией конструктора вложенных классов.

Вот мой код:

#include <iostream>

using namespace std;

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

    }title;
}document;

int main()
{
    document.title("Hello World"); //Error in this line
    return 0;
}

Я получаю ошибку:

fun.cpp:21:30: error: no match for call to '(a::b)'

Ответы [ 4 ]

6 голосов
/ 06 февраля 2012

Возможно, вы хотите что-то вроде:

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

Это потому, что title уже является членом a, однако у вас нет конструктора по умолчанию для него.Либо напишите конструктор по умолчанию, либо инициализируйте его в списке инициализации.

1 голос
/ 06 февраля 2012

Это:

document.title("Hello World");

не «инициализирует вложенный класс»; он пытается вызвать operator() для объекта.

Вложенный объект уже инициализируется при создании document. За исключением того, что это не так, потому что вы не предоставили конструктор по умолчанию.

1 голос
/ 06 февраля 2012

Вы должны либо сделать свой элемент данных указателем, либо вы можете вызвать только конструктор члена данных из списка инициализаторов класса, членом которого он является (в данном случае a)

0 голосов
/ 06 февраля 2012

Итак, что у вас здесь:

class A {
  B title;
}

Без определения конструктора для класса A (как показал Лучиан Григоре) заголовок будет инициализирован как: B title();

Вы можете работать так, чтовокруг:

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

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

  }

  B( const char *str){

  }
}

Заголовок объекта (в документе) уже инициализирован, и вы больше не можете вызывать конструктор, но вы все равно можете использовать синтаксис: document.title(...), объявив и определив operator(), но он не будетбыть конструктором:

class B {
  const B& operator()(const char *str){
     cout << str;
     return *this;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...