определение метода вне объявления класса

пожалуйста, как я могу написать определение конструктора с параметрами вне объявления класса?

class A{
public:
A(int x);
~A();
}

A::A(int x) { ... }
A::~A(){...}class B : public A
{
public:
B(int x):A(x){ this work fine}
~B(){}

}

и это не работа

class B : public A
{
public:
B(int x):A(x); // error here
~B();

}

B::B(int x):A(x){ this not work };
B::~B();

1

Решение

Вы смешиваете декларацию с реализацией. Так должно быть:

class B : public A
{
public:
B(int x);
~B();
}

B::B(int x):A(x){ /*this works */ };
B::~B() {}
1

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

Этот вопрос, кажется, собирает необычное количество неправильных ответов (хотя некоторые выглядят так, будто они являются результатом недосмотра, а не недоразумения).

Ситуация довольно простая. Внутри определения класса вы можете иметь либо объявление функции-члена, либо определение функции-члена. Вне определения класса вы можете иметь только определение функции (в этом случае внутри определения класса вы должны только объявить эту функцию, но не определять ее). Это означает, что исправленный код выглядит примерно так:

class B : public A {  // This is the class definition.
public:
B(int x);    // declare member functions here.
~B();
};

// define member functions here.
//
B::B(int x) : A(x) { /* body */ }
B::~B() { /* body */ }      // a declaration like `B::~B();` is not allowed here.
4

B(int x):A(x); // error here

Вы удалили тело метода, но забыли удалить список инициализации членов:

B(int x); // No error

Кроме того, вам нужно ставить точки с запятой после последней закрывающей скобки в определениях вашего класса.

3

Пытаться

class B : public A
{
public:
B(int x);
~B();
};

B::B(int x):A(x){ }
B::~B() {}
0

Это ваш код:

class B : public A
{
public:
B(int x):A(x); // error here
~B();

}

Когда вы делаете что-то вроде ~B(); ты declarating существование деструктора, но поскольку вы оказались там (обратите внимание на «;»), вы не определили его.
То же самое относится и к конструктору, в строке, которую вы отметили, вы вызвали супер-конструктор, который является определение, но вы не предоставили тело метода, которое ожидается только на декларации.

Чтобы решить вашу проблему, просто оставьте объявление как B(int x);без указания того, как B связан с A, это будет позже определено позже в определении.

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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector