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

76
12

У меня есть абстрактный базовый класс Object и два производных класса: Paddle и Ball. Конструктор Paddle принимает в качестве параметра указатель на Ball так что я могу получить его положение, чтобы вычислить движение весла:

Paddle::Paddle(Vec location, Vec size, float AIspeed, Ball* prtBall)
: Object(location, size)
{
/* ... */
gameBall = ptrBall;
}

IntelliSense не считает это недопустимым, но всякий раз, когда я скомпилирую код, VS2013 неожиданно вызывает следующие ошибки:

1>\object\paddle.h(8): error C2061: syntax error : identifier 'Ball'
1>\object\paddle.h(43): error C2143: syntax error : missing ';' before '*'
1>\object\paddle.h(43): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>\object\paddle.h(18): error C2065: 'gameBall' : undeclared identifier
1>\object\paddle.h(18): error C2065: 'ptrBall' : undeclared identifier
1>\object\paddle.h(30): error C2065: 'gameBall' : undeclared identifier

Первые два особенно интересны... По внешнему виду, компилятор не признает, что Ball* является типом. Строка 8 - та, что находится выше, и это строки 40-44:

private:
void Foo();

Ball* gameBall;
float bar;

Сначала я думал, что забыл включить определение Ball в файл paddle.h. Но это не так. Является ли то, что я делаю правильно, или есть недостаток, который в настоящее время игнорируется?

спросил(а) 2021-01-19T18:34:47+03:00 2 месяца, 3 недели назад
1
Решение
106

Да, при условии, что права доступа к члену или методу sibling являются общедоступными.

Братья и сестры не имеют доступа к другим частным или защищенным данным и другим элементам данных sibling.

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

ответил(а) 2021-01-19T18:34:47+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема