Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 10.04.2010, 21:32   #1
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию Наследование классов

Здравствуйте.Написал класс и его подкласс,но компилятор выдает ошибку..Ошибка собственно -undefined reference to `engine::getPower()'

Код:
#include <iostream>

using namespace std;

class engine {
   
   public:
    int getPower();
  
};
class car : public engine {
    int k;
    public:
    car (int x) {k=x;}
    void showk() { cout << k <<"\n";}
};
int main ()
{
    car opel (3);

  
    opel.showk();
    opel.getPower();
    return 0;
}
int getPower()
{
  int power=0;
    int work=0;
    int time=0;
     cout <<"Введите работу"<<endl;
    cin >> work;
    cout <<"Введите время работы"<<endl;
    cin>> time;
    power=work/time;
    cout<<"мощность равна:"<<power<<endl;

}
Подскажите пожалуйста)
Serjuk вне форума   Ответить с цитированием
Старый 10.04.2010, 21:48   #2
N1KeL
Пользователь
 
Аватар для N1KeL
 
Регистрация: 20.04.2009
Сообщений: 58
По умолчанию

Функция int getPower() должна возвращать значение целочисленного типа, а у вас она ничего не возвращает
N1KeL вне форума   Ответить с цитированием
Старый 10.04.2010, 21:51   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вы реализовали getPower, как глобальную ф-цию, а не как член класса, перепишите так:
Код:
int engine::getPower()
{
   int power = 0;
...
и насчёт того, что оно должно возвращать значение, верно подмечено )
netrino вне форума   Ответить с цитированием
Старый 10.04.2010, 22:16   #4
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

спасибо заработало))А еще вопрос,а можете объяснить на этом примере, что такое композиция класса ?)
Serjuk вне форума   Ответить с цитированием
Старый 10.04.2010, 22:59   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Используй Вы композицию, engine был бы не предком класса car, а его полем
netrino вне форума   Ответить с цитированием
Старый 11.04.2010, 09:05   #6
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

всмысле полем?)
Serjuk вне форума   Ответить с цитированием
Старый 11.04.2010, 11:11   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

В смысле
Код:
class car
 {
 public:
 class engine
  {
  public:
  int getPower();
  }
 //...
 };
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума   Ответить с цитированием
Старый 11.04.2010, 13:56   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну не обязательно так, описание класса engine может быть вне класса car, но в классе car одним из полей(свойств в терминах C++) выступает объект engine
Код:
class engine {
  public:
    int getPower();
};

class car {
  public:
    engine eng;
};

Последний раз редактировалось netrino; 11.04.2010 в 14:06.
netrino вне форума   Ответить с цитированием
Старый 11.04.2010, 16:14   #9
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

Правильно ли я делаю композицию?
Код:
class engine {

   public:
   int getPower();
 
};
class car : public engine {
    int k;
    public:
    class toyota
  {
  public:
  int getCountry();
  };
  
};
int main(){
 car opel;
 opel.getPower();
    car::toyota:getCountry();// я понимаю так надо обращаться??? на этой строчке выдает ошибку :"error: expected unqualified-id before ':' token"
    getchar();
}
Помогите пожалуйста)
Serjuk вне форума   Ответить с цитированием
Старый 11.04.2010, 16:25   #10
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Код:
#include <iostream>

using namespace std;

class engine {

   public:
   int getPower();
 
};
class toyota
{
 public:
  int getCountry();
 };

class car : public engine 
{
private:
 int k;
public:
  toyota toyta;
  
};

int main(){
	car opel;
	opel.toyta.getCountry();
	getchar();
}
Вот так ошибки выдавать не будет. Но у тебя тут не правильно сделано. Машина не может наследовать двигатель и тойота не может быть элементом машины. Правильно будет сделать так:
Двигатель является элементом машины(композиция), а тойота наследуется от машины(Наследование)
Это будет выглядеть так:
Код:
class Engine 
{
   public:
   int getPower();
};

class Car
{
private:
  int k;
public:
  Engine engine;
  
};

class Toyota : public Car
{
  public:
     int getCountry();
};
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer

Последний раз редактировалось Ozerich; 11.04.2010 в 16:27.
Ozerich вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наследование beregok Общие вопросы C/C++ 1 04.07.2009 22:39
наследование классов Dimarik Общие вопросы C/C++ 15 02.07.2009 20:00
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18
Наследование Кирилл13 Общие вопросы C/C++ 1 11.11.2008 15:47


11:11.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.