Вперед объявляет с информацией о наследстве
-
11-10-2019 - |
Вопрос
Это хорошо компилирует, хотя я бы еще не хотел пробовать его запускать. Однако ...
//class base;
//class derived;
//class derived : public base;
class base {};
class derived : public base {};
class other
{
public:
void func() {base1 = derived1;}
base* base1;
derived* derived1;
};
void main()
{
}
... Перемещение класса к другому выше определения базы и полученного, для которого есть похожая вещь, которую я должен сделать в программе Myne, вызывает ошибки компиляции.
Очевидное решение состоит в том, чтобы пересылать базу Declate и полученное, показанное в верхней части кода, однако это приводит к преобразованию между базой* и полученной* ошибкой. Попытка пересылать объявление, включая информацию о наследстве, тоже не работают.
Решение
Это должно работать. Вам нужно переместить вверх
Но объявить фанк ниже. Таким образом, фанк способен «видеть», который получен, имеет основу типа.
например,
class base;
class derived;
//class derived : public base;
class other
{
public:
void func();
base* base1;
derived* derived1;
};
class base {};
class derived : public base {};
void other::func() { base1 = derived1; }
Другие советы
Не существует синтаксиса для двух классов вперед, и указывает один наследство от другого. Это потому, что наследование может быть сложным (множественным и/или виртуальным), поэтому назначение base1 = derived1
может включать некоторую арифметику, и компилятор трудно/невозможно генерировать эту арифметику, только когда он знает, что это знает, что derived
наследует от base
.
Итак, чтобы решить вашу проблему, вы можете сделать func
не встроенный (см. Ответ от AbstractDissonance), или, если вам абсолютно нужно, чтобы он был встроен, используйте reinterpret_cast
:
class base;
class derived;
class other
{
public:
void func() {base1 = reinterpret_cast<base*>(derived1);}
base* base1;
derived* derived1;
};
Это плохо, потому что это не гарантированно будет работать по стандарту C ++, и это почти наверняка не будет работать, если вы используете несколько/виртуальное наследование. Используйте это только если func
должно быть как можно быстрее (т.е. в соответствии), и если вам не нужно, чтобы ваш код был портативным.