Ниже мой код
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 «. Не могли бы вы помочь, как это сделать.
Заранее большое спасибо.
Ваш компилятор делает все правильно здесь. Короче, ты не можешь сделать это. Вы можете выполнить преобразование между указателем базового класса и указателем производного класса, если они указывают на один и тот же объект. Но массив Base и массив Derived являются не то же самое.
Хорошей новостью является то, что вы хотите сделать проще, чем вы думаете. Указатель производного класса уже неявно преобразуется в указатель базового класса без приведения. Предполагая, что вы знаете размеры ваших двух массивов и размеры одинаковы, это простой цикл:
// Given:
A** someNumbers;
B** someValues;
for (int i = 0; i < size; ++i) {
*someNumbers[i] = *someValues[i];
}
Кроме того, такого рода проблемы, почему у нас есть стандартные контейнеры, такие как вектор. Некоторые действительно умные люди уже решили это безумие указателя для вас. Я настоятельно рекомендую воспользоваться этим. Это сделает ваш опыт C ++ намного лучше.
void C::getNum(A**& somenum)
{
dObj->getNumber(static_cast<B**>(somenum)); // Error here.
}
static_cast
используется для выполнения преобразований между указателями на связанные классы или для выполнения любого другого не указательного преобразования, которое также может выполняться неявно. что не так в вашем примере выше. вот почему static_cast
не может быть использован здесь.
Поскольку C ++ поддерживает множественное наследование (и другие функции), A *
является конвертируемый к B *
но не обязательно идентичный к B *
, Преобразование между типами указателей может переместить значение указателя на некоторое количество байтов.
В результате невозможно преобразовать A **
к B **
или наоборот. Преобразование базы в производное должно произойти после извлечения значения из внешнего указателя.
Множественная косвенность обычно является плохой идеей. Трудно понять, какая структура данных может помочь, но обзор стандартных контейнеров библиотеки может быть проницательным. В любом случае, спасибо за сжатие этого замечательного отдельного примера!