У меня есть класс, где конструктор получает целое число:
class One
{
public:
One(int i)
{
foo(i);
}
void foo(int i)
{
// Do something with i
}
};
Выше компилируется нормально.
У меня есть второй класс, который имеет член типа Один. Компиляция этого приводит к ошибке, где я передаю int (ошибка «ожидается спецификатор типа»):
class Two
{
public:
One x(1);
};
Я могу, однако, инициализировать член, если это указатель:
class Three
{
public:
One *x = new One(1);
};
Могу ли я инициализировать класс без использования указателя?
Спасибо!
С:
class Two
{
public:
One x(1);
};
и на основе правил языка компилятор пытается разобрать x
как функция-член, возвращающая объект типа One
, а не видя действительным параметров деклараций который требует по крайней мере список 0 или более Тип Спецификаторs, он видит не типа.
class Three { public: One *x = new One(1); };
Могу ли я инициализировать класс без использования указателя?
Да, используйте равномерная распорка инициализация синтаксис для Значение инициализация:
class Three
{
public:
One x{1};
};
Или же копия инициализация:
class Three
{
public:
One x = 1; //Uses converting constructor,
//see http://en.cppreference.com/w/cpp/language/converting_constructor
//or
One x = One(your, multiple, arguments, here);
};
Или же член-инициализатор-листы в конструкторе:
class Three
{
public:
Three(...) : x(1) { ... }
One x;
...
};
One x(1);
анализируется как объявление функции, поэтому он ожидает тип в скобках. Ты можешь использовать
One x = 1;
или же
One x{1};
вместо.