Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 14.03.2017
Сообщений: 6

Ошибка при компиляции. Как правильно создавать класс с объектами от другого класса?

04.05.2017, 18:17. Показов 1309. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс Car. У него есть двигатель(class Engine) и переменная скорость(speed), которая зависит от мощности(power). power- переменная класса Engine.
Как сделать так, чтобы при изменении мощности двигателя, изменялась и скорость в классе Car. Сейчас у меня ошибка при компиляции на 18 строке. Как я понимаю, это из-за того, что компилятор на этой строке еще не знает что именно есть внутри класса Car.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Car;
 
 
class Engine
{
public:
    Engine(Car* carOwner) :carOwner(carOwner){};
    Car* carOwner;
    void setPower(int);
    int getPower();
private:
    int power;
};
 
void Engine::setPower(int s)
{
    power = s;
    carOwner->speed=power*100; //error C2227: left of '->speed' must point to class/struct/union/generic type
}
int Engine::getPower()
{
    return power;
}
 
 
class Car
{
public:
    Car() :engine(this), speed(0){};
    Engine engine;
    friend Engine;
    int getSpeed();
private:
    int speed;
};
 
int Car::getSpeed()
{
    return speed;
}
Нужно, чтобы это заработало:
C++
1
2
3
4
5
6
7
8
int main(){
 
    Car Lada11;
    Lada11.engine.setPower(2);
    std::cout << Lada11.getSpeed() << '\n'; //speed должно быть = 200;
 
    system("pause");
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.05.2017, 18:17
Ответы с готовыми решениями:

Класс: Как правильно создавать переменные класса?
Пытаюсь визуализировать граф, по клику мыши создается вершина, но возникает ошибка. В классе графа список listTop не инициализирован, а...

Как из другого класса управлять объектами класса Form1 ?
Добрый вечер, подскажите, пожалуйста. Создал форму Form1, создал отдельный класс (подписчик на одно событие из Форм1) , в котором ,вроде...

Ошибка компиляции (преобразование объекта класса в объект другого класса)
Друзья, добрый день! Не могу понять почему выдается ошибка компиляции... Прога преобразует доллары США в старые Британские фунты. Но...

7
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
04.05.2017, 18:22
Лучший ответ Сообщение было отмечено WMax как решение

Решение

определите сперва классы, и уже после этого можно имплементить методы, в которых идут всякие обращения к объектам:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Engine
{
...
};
 
class Car
{
...
};
 
void Engine::setPower(int s)
{
    power = s;
    carOwner->speed=power*100; // теперь должно быть ок, т.к. в этом месте Car уже определен.
}
 
...
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
04.05.2017, 18:27
Цитата Сообщение от WMax Посмотреть сообщение
C++
1
Car* carOwner;
Не нужно это в Engine.
0
 Аватар для behollder
47 / 28 / 12
Регистрация: 23.01.2013
Сообщений: 125
04.05.2017, 18:33
если разнесешь классы по файлам, заработает
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
04.05.2017, 18:34
Цитата Сообщение от behollder Посмотреть сообщение
если разнесешь классы по файлам, заработает
Нет никакой разницы. Тем более, надо сначала архитектуру поправить (см замечание nd2), иначе ещё проблемы с forward declaration решать.
0
 Аватар для behollder
47 / 28 / 12
Регистрация: 23.01.2013
Сообщений: 125
04.05.2017, 18:36
MrGluck, не знаю, я в код не в читывался вообще, копипастнул по файлам и gcc принял. вообще, я согласен.
0
0 / 0 / 0
Регистрация: 14.03.2017
Сообщений: 6
04.05.2017, 19:51  [ТС]
Цитата Сообщение от DU3 Посмотреть сообщение
определите сперва классы, и уже после этого можно имплементить методы, в которых идут всякие обращения к объектам
точно, спасибо.
Цитата Сообщение от nd2 Посмотреть сообщение
C++
1
Car* carOwner;
Не нужно это в Engine.
Почему? Как будет правильно?
0
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10
04.05.2017, 20:07
C++
1
2
3
4
float Car::getSpeed()
{
    return engine.getPower()/transmission.getResist();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.05.2017, 20:07
Помогаю со студенческими работами здесь

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

Как правильно создавать экземпляры полей класса?
Как правильно создавать экземпляры полей класса? У меня 2 варианта. Много где читал, что правильно делать как во 2 варианте, и сам так же...

Ошибка при попытке использовать объект класса в определении другого класса
Муторное название получилось :scratch: Прошу помощи.... есть созданный класс работы со строкой: &quot;MyString.h&quot; class...

Ошибка при обращении из одного класса к методу другого класса
Структура проекта, 2 класса: класс графики MainWindow класс логики Сannibals при обращении из mainwindow к методу из cannibals...

Ошибка при работе с объектом класса в конструкторе другого класса
Имеется данный код: https://github.com/ubelian/glgame/tree/master/glgame В файле Food.cpp в конструкторе класса Food::Food() на 19...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru