Ошибка компиляции C ++ в static_cast & lt; & GT;

Ниже мой код

Class A
{
A::A(int num) { }
int num;
};

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

Class D;
Class C
{
void getNum(A**& somenum) {}
D *dObj;
};

void C::getNum(A**& somenum)
{
dObj->getNumber(static_cast<B**>(somenum)); // Error here.
}

Class D
{
void getNumber(B**& number)
{
B someValue[5];
// all the objects in the array are properly created and properly Initalized (skipped that part)

number[0] = someValue[0];
number[1] = someValue[1];
//...
}
};

Я получаю ошибку компиляции при выполнении static_cast. Я пытаюсь присвоить значения в массиве «someValue» для «A **& somenum «. Не могли бы вы помочь, как это сделать.

Заранее большое спасибо.

0

Решение

Ваш компилятор делает все правильно здесь. Короче, ты не можешь сделать это. Вы можете выполнить преобразование между указателем базового класса и указателем производного класса, если они указывают на один и тот же объект. Но массив Base и массив Derived являются не то же самое.

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

// Given:
A** someNumbers;
B** someValues;

for (int i = 0; i < size; ++i) {
*someNumbers[i] = *someValues[i];
}

Кроме того, такого рода проблемы, почему у нас есть стандартные контейнеры, такие как вектор. Некоторые действительно умные люди уже решили это безумие указателя для вас. Я настоятельно рекомендую воспользоваться этим. Это сделает ваш опыт C ++ намного лучше.

1

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

void C::getNum(A**& somenum)
{
dObj->getNumber(static_cast<B**>(somenum)); // Error here.
}

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

1

Поскольку C ++ поддерживает множественное наследование (и другие функции), A * является конвертируемый к B * но не обязательно идентичный к B *, Преобразование между типами указателей может переместить значение указателя на некоторое количество байтов.

В результате невозможно преобразовать A ** к B ** или наоборот. Преобразование базы в производное должно произойти после извлечения значения из внешнего указателя.

Множественная косвенность обычно является плохой идеей. Трудно понять, какая структура данных может помочь, но обзор стандартных контейнеров библиотеки может быть проницательным. В любом случае, спасибо за сжатие этого замечательного отдельного примера!

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