Нелегальная инициализация участника

Я использую этот довольно простой класс без какого-либо наследования.

class A
{
int a;
int b;

public:
A(int x, int y) { a = x; b = y;}
A() :A(0,0){};
~A(){};
} ;

int main ()
{
A a1, a2(5, 7) ;
}

Я получаю эту ошибку.

ошибка C2614: «A»: недопустимая инициализация члена: «A» не является базой или членом

Есть похожие вопросы по SO, но они касаются наследования. Может кто-нибудь объяснить причину, и что стандарт говорит об этом?

РЕДАКТИРОВАТЬ:

Было бы лучше, если бы кто-то более подробно рассказал о конструкторе пересылки и этой функции в C ++ 11.

5

Решение

Если вы можете использовать C ++ 11, вы можете инициализировать A() от A(int, int), Это невозможно в C ++ 03, где вам нужно написать два отдельных конструктора.

Если вы хотите, чтобы ваш код работал на C ++ 03, у вас есть два варианта:

  • Создать функцию init(int, int) и назовите это от каждого из ваших конструкторов. Это хороший выбор, если ваш конструктор много работает.
  • Двойное поведение в обоих конструкторах. Это хороший выбор, когда все, что вы делаете, это инициализация членов.

Вы также можете вызвать базовый конструктор из конструктора дочернего класса. Например, если у вас есть

class A {
A(int, int);
};
class B : public A {
B(int, int);
};

Вы могли бы написать

B::B(int x, int y) : A(x,y) {}

Это то, что имеет в виду ваш компилятор, когда говорит, что A is not a baseОжидаю эту ситуацию.

Все они совместимы с C ++ 03.

Вы также можете обновить свой компилятор для поддержки функций C ++ 11. Я бы не рекомендовал это, если вы работаете в Linux и хотите, чтобы ваш проект компилировался в Windows, потому что компиляторы Windows не реализуют все функции C ++, которые делают компиляторы Linux (если вы не платите за хороший компилятор).

5

Другие решения

это из-за вашей проблемы с конструктором в:

Судя по вашему сообщению об ошибке, я предполагаю, что вы работаете в Visual Studio (вероятно, 2010), и я согласен, это не работает в VS2010.

A:A(0,0){ }

Фикс для VS 2010 и его предшественников: A():a(0),b(0){}

1

Вы не можете сделать это так A() :A(0,0){}; этот способ используется для инициализации базовых членов класса.

A(){a=0;b=0;};

или если вы хотите определить private: void set(int x, int y); и использовать его в конструкторах.

0

A() :A(0,0){}; называется конструктор цепочки.

Вы должны проверить, что ваш компилятор принимает C ++ 11. Цепочка конструктора действительна только в C ++ 11. Это не было доступно раньше.

Какой компилятор вы используете?

0

Вы пытаетесь использовать делегирующий конструктор, который является языковой функцией, которая была представлена ​​только в C++11и который еще не реализован в каждом компиляторе.

0
По вопросам рекламы [email protected]