Вопрос

Это хорошо компилирует, хотя я бы еще не хотел пробовать его запускать. Однако ...

//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 должно быть как можно быстрее (т.е. в соответствии), и если вам не нужно, чтобы ваш код был портативным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top