Форум программистов, компьютерный форум CyberForum.ru

Как создать объект класса? ПРоблемма из-за раздельной компиляции - C++

Восстановить пароль Регистрация
 
allure
1 / 1 / 0
Регистрация: 13.11.2013
Сообщений: 41
13.11.2013, 19:04     Как создать объект класса? ПРоблемма из-за раздельной компиляции #1
Есть 4 файла
engine.h - базовый класс
engine.cpp - реализация методов базового класса
car.h - класс поизводный от engine
car.cpp - реализация класа car
main.cpp - функция main
в main создаётся объект класса car
car a;
так не компилируется g++;
если всё в одном файле, то всё проходит.
engine.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
using namespace std;
class engine
{
 protected:
    short power;
    float displace; //объём
    string fuel; 
    bool run;
public:
    engine (short,float,string);
    bool runing();
    bool stop();
    friend istream& operator>>(istream&, engine&);
    friend ostream& operator<<(ostream&, engine&);
};

engine.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "engine.h"
engine::engine (short pow,float dis,string f):
        power(pow), displace(dis), fuel(f)
    {}
istream& operator>>(istream& stream, engine& a)
    {return stream>>a.power>>a.displace>>a.fuel;}
ostream& operator<<(ostream& stream, engine& a)
    {
    if (a.run) return stream<<a.power<<a.displace<<a.fuel<<"Запущен\n";
    return stream<<a.power<<a.displace<<a.fuel<<"Не запущен";
    }
bool engine::runing()
    {
    cout<<"Двигатель заведён"<<endl;
    run=true;
    return true;
    }
bool engine::stop()
    {
    cout<<"Двигатель заглушен"<<endl;
    run=false;
    return false;
    }

car.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "engine.h"
class car :public engine
{
    string marka; 
    short year;
    double speed;
  public:
    friend istream& operator>>(istream&, car&);
    friend ostream& operator<<(ostream&, car&);
    car(short,float,string,string, short, double);
    void drive();
};

car.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "car.h"
car::car(short pow=200,float dis=2.6,string f="бензин",
         string m="No", short y=2013, double sp=220):
      engine(pow,dis,f), 
      year(y),marka(m), speed(sp)
    {
    cout<<*this;
    }
istream& operator>>(istream& stream, car& a)
    {return stream>>a.marka>>a.year>>a.speed>>a.power>>a.displace>>a.fuel;}
ostream& operator<<(ostream& stream, car& a)
    {return stream<<endl<<"Марка: "<<a.marka<<".  Год выпуска: "<<a.year
    <<".  Максимальная скорость: "<<a.speed<<'.'<<endl;}
void car::drive()
    {
      std::cout<<"Вжиииих";
    }

main.cpp
C++
1
2
3
4
5
6
#include "car.h"
int main ()
{
    car a;
    return 0;
}

Терминал
$ g++ engine.h car.h main.cpp
main.cpp: In function ‘int main()’:
main.cpp:4:6: error: no matching function for call to ‘car::car()’
car a;
^
main.cpp:4:6: note: candidates are:
car.h:10:5: note: car::car(short int, float, std::string, std::string, short int, double)
car(short,float,string,string, short, double);
^
car.h:10:5: note: candidate expects 6 arguments, 0 provided
car.h:2:7: note: car::car(const car&)
class car : public engine
^
car.h:2:7: note: candidate expects 1 argument, 0 provided

Подскажите, где накасячил? И как исправить. Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2013, 19:04     Как создать объект класса? ПРоблемма из-за раздельной компиляции
Посмотрите здесь:

C++ Как создать объект с конструктором в интерфейсе другого класса?
Заголовочный файл или Механизм раздельной компиляции C++
C++ Ошибка компиляции (преобразование объекта класса в объект другого класса)
C++ Реализация раздельной компиляции
C++ Как создать объект класса в динамической памяти?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:08     Как создать объект класса? ПРоблемма из-за раздельной компиляции #2
Цитата Сообщение от allure Посмотреть сообщение
car a;
это вызов конструктора по умолчанию, которого у Вас нету. На самом деле в этой строке написано car a();
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
13.11.2013, 19:09     Как создать объект класса? ПРоблемма из-за раздельной компиляции #3
g++ engine.h car.h engine.cpp car.cpp main.cpp
allure
1 / 1 / 0
Регистрация: 13.11.2013
Сообщений: 41
13.11.2013, 19:10  [ТС]     Как создать объект класса? ПРоблемма из-за раздельной компиляции #4
Цитата Сообщение от metaluga145 Посмотреть сообщение
это вызов конструктора по умолчанию, которого у Вас нету. На самом деле в этой строке написано car a();
Получается нужно все конструкторы писать?

Добавлено через 34 секунды
Цитата Сообщение от stima Посмотреть сообщение
g++ engine.h car.h engine.cpp car.cpp main.cpp
Спасибо. Так и делал.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:12     Как создать объект класса? ПРоблемма из-за раздельной компиляции #5
allure, ну конструктор по умолчанию вообще лучше иметь.
Фразу "все конструкторы" не сильно понял) только те которые нужны) если вызываете конструктор по умолчанию, то понятно, что он нужен. Вы, конечно, можете вызвать конструктор,который у Вас там есть, тогда просто в скобках напишите необходимые параметры.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
13.11.2013, 19:12     Как создать объект класса? ПРоблемма из-за раздельной компиляции #6
Также про гварды не забываем.
allure
1 / 1 / 0
Регистрация: 13.11.2013
Сообщений: 41
13.11.2013, 19:13  [ТС]     Как создать объект класса? ПРоблемма из-за раздельной компиляции #7
Цитата Сообщение от metaluga145 Посмотреть сообщение
это вызов конструктора по умолчанию, которого у Вас нету. На самом деле в этой строке написано car a();
А car a(); работает. А допустим car a (500) нет. Тоесть передавать либо всё, либо ничего?
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:15     Как создать объект класса? ПРоблемма из-за раздельной компиляции #8
Цитата Сообщение от allure Посмотреть сообщение
А car a(); работает. А допустим car a (500) нет. Тоесть передавать либо всё, либо ничего?
Можно указать в конструкторе значения по умолчанию. Тогда не все. А так да, все надо указывать
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
13.11.2013, 19:17     Как создать объект класса? ПРоблемма из-за раздельной компиляции #9
как понять работает?

Вообщето это
C++
1
car a();
Это обьявление функции))
allure
1 / 1 / 0
Регистрация: 13.11.2013
Сообщений: 41
13.11.2013, 19:17  [ТС]     Как создать объект класса? ПРоблемма из-за раздельной компиляции #10
Цитата Сообщение от metaluga145 Посмотреть сообщение
Можно указать в конструкторе значения по умолчанию. Тогда не все. А так да, все надо указывать
Всё понял. Огромное спасибо!
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:19     Как создать объект класса? ПРоблемма из-за раздельной компиляции #11
stima, это он у меня взял я типа хотел показать, что там конструктор вызывается) надо было написать car a = car(); Так более понятно)
allure
1 / 1 / 0
Регистрация: 13.11.2013
Сообщений: 41
13.11.2013, 19:32  [ТС]     Как создать объект класса? ПРоблемма из-за раздельной компиляции #12
Цитата Сообщение от metaluga145 Посмотреть сообщение
Можно указать в конструкторе значения по умолчанию. Тогда не все. А так да, все надо указывать
Переписал конструкторы на:
C++
1
2
3
4
5
6
7
car::car(short pow=200,float dis=2.6,string f="бензин",
         string m="No", short y=2013, double sp=220):
      engine(pow,dis,f), 
      year(y),marka(m), speed(sp)
    {
    cout<<*this;
    }
и
C++
1
2
3
engine::engine (short pow=200,float dis=2.6,string f="бензин"):
        power(pow), displace(dis), fuel(f)
    {}
он всё ровно не хочет.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:45     Как создать объект класса? ПРоблемма из-за раздельной компиляции #13
allure, на что ругается? Кст, не стоит использовать зарезервированные слова(в Вашем коде это pow). Может библиотека math у Вас и не подключена, но все же не стоит.
allure
1 / 1 / 0
Регистрация: 13.11.2013
Сообщений: 41
13.11.2013, 19:51  [ТС]     Как создать объект класса? ПРоблемма из-за раздельной компиляции #14
Цитата Сообщение от metaluga145 Посмотреть сообщение
allure, на что ругается? Кст, не стоит использовать зарезервированные слова(в Вашем коде это pow). Может библиотека math у Вас и не подключена, но все же не стоит.
о pow не подумал. спасибо
если main такое:
C++
1
2
3
4
5
6
7
#include "car.h"
int main ()
{
    car a(500);
    cout<<a;
    return 0;
}
то терминал такой
Терминал

main.cpp: In function ‘int main()’:
main.cpp:4:11: error: no matching function for call to ‘car::car(int)’
car a(500);
^
main.cpp:4:11: note: candidates are:
car.h:10:5: note: car::car(short int, float, std::string, std::string, short int, double)
car(short,float,string,string, short, double);
^
car.h:10:5: note: candidate expects 6 arguments, 1 provided
car.h:2:7: note: car::car(const car&)
class car ublic engine
^
car.h:2:7: note: no known conversion for argument 1 from ‘int’ to ‘const car&’

если main такое:
C++
1
2
3
4
5
6
7
#include "car.h"
int main ()
{
    car a;
    cout<<a;
    return 0;
}
то терминал такой
Терминал
main.cpp: In function ‘int main()’:
main.cpp:4:11: error: no matching function for call to ‘car::car(int)’
car a(500);
^
main.cpp:4:11: note: candidates are:
car.h:10:5: note: car::car(short int, float, std::string, std::string, short int, double)
car(short,float,string,string, short, double);
^
car.h:10:5: note: candidate expects 6 arguments, 1 provided
car.h:2:7: note: car::car(const car&)
class car ublic engine
^
car.h:2:7: note: no known conversion for argument 1 from ‘int’ to ‘const car&’
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:56     Как создать объект класса? ПРоблемма из-за раздельной компиляции #15
allure, не уверен, что в с++ short int и int это одно и то же, не смотря на то, что занимает одинаковое количество памяти. У Вас описан параметр как short int, а передаете int. Возможно в этом ошибка, но не уверен.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
13.11.2013, 20:04     Как создать объект класса? ПРоблемма из-за раздельной компиляции #16
2allure Почитайте, что такое конструктор по умолчани, перегруженный конструктор и как с этим все работать, просто видно, что Вы не совсем лавливаете суть о чем речь.
allure
1 / 1 / 0
Регистрация: 13.11.2013
Сообщений: 41
13.11.2013, 20:07  [ТС]     Как создать объект класса? ПРоблемма из-за раздельной компиляции #17
Цитата Сообщение от metaluga145 Посмотреть сообщение
allure, не уверен, что в с++ short int и int это одно и то же, не смотря на то, что занимает одинаковое количество памяти. У Вас описан параметр как short int, а передаете int. Возможно в этом ошибка, но не уверен.
не в этом, ибо
C++
1
2
short b=5;
    car a(b);
тоже не работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2013, 20:26     Как создать объект класса? ПРоблемма из-за раздельной компиляции
Еще ссылки по теме:

Создать функцию которая возводит число в квадрат, использовать принцип раздельной компиляции C++
Как создать объект класса в потоке? C++
Не видно определений функций при раздельной компиляции C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11840 / 6819 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
13.11.2013, 20:26     Как создать объект класса? ПРоблемма из-за раздельной компиляции #18
Параметры по умолчанию в объявлении класса укажите:

C++
1
2
3
4
5
6
7
8
#include "engine.h"
class car :public engine
{
//..
    car(short =200,float =2.6,string ="бензин",
         string ="No", short =2013, double =220);
//..
};
Yandex
Объявления
13.11.2013, 20:26     Как создать объект класса? ПРоблемма из-за раздельной компиляции
Ответ Создать тему
Опции темы

Текущее время: 20:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru