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

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

04.05.2017, 18:17. Показов 1331. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru