Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
allure
2 / 2 / 0
Регистрация: 13.11.2013
Сообщений: 41
#1

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

13.11.2013, 19:04. Просмотров 528. Ответов 17
Метки нет (Все метки)

Есть 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

Подскажите, где накасячил? И как исправить. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2013, 19:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как создать объект класса? ПРоблемма из-за раздельной компиляции (C++):

Создать функцию которая возводит число в квадрат, использовать принцип раздельной компиляции - C++
Создать функцию которая возводит число в квадрат. Использовать принцип раздельной компиляции. Заранее спасибо!

Как правильно использовать заголовочные файлы при раздельной компиляции в MS Visual Studio? - C++
Если я использую функцию cout и cin в каждом модуле, мне нужно в каждом модуле прописывать : #include &lt;iostream&gt; using namespace std; ...

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

Реализация раздельной компиляции - C++
Здравствуйте! Я самоучка поэтому я... Я облазил кучу различных источников, но понял только принцип, по которому...

Порядок раздельной компиляции 3 файлов - C++
Что-то не пойму, объясните мне на пальцах, как откомпилировать три файла (1 заголовочный) вместе. Использую DEV-C++ . coordin.h: //...

Как создать объект класса в потоке? - C++
Как создать объект класса в потоке? Это вообще возможно?

17
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:08 #2
Цитата Сообщение от allure Посмотреть сообщение
car a;
это вызов конструктора по умолчанию, которого у Вас нету. На самом деле в этой строке написано car a();
0
stima
492 / 342 / 42
Регистрация: 22.03.2011
Сообщений: 1,104
Завершенные тесты: 2
13.11.2013, 19:09 #3
g++ engine.h car.h engine.cpp car.cpp main.cpp
0
allure
2 / 2 / 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
Спасибо. Так и делал.
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:12 #5
allure, ну конструктор по умолчанию вообще лучше иметь.
Фразу "все конструкторы" не сильно понял) только те которые нужны) если вызываете конструктор по умолчанию, то понятно, что он нужен. Вы, конечно, можете вызвать конструктор,который у Вас там есть, тогда просто в скобках напишите необходимые параметры.
0
stima
492 / 342 / 42
Регистрация: 22.03.2011
Сообщений: 1,104
Завершенные тесты: 2
13.11.2013, 19:12 #6
Также про гварды не забываем.
1
allure
2 / 2 / 0
Регистрация: 13.11.2013
Сообщений: 41
13.11.2013, 19:13  [ТС] #7
Цитата Сообщение от metaluga145 Посмотреть сообщение
это вызов конструктора по умолчанию, которого у Вас нету. На самом деле в этой строке написано car a();
А car a(); работает. А допустим car a (500) нет. Тоесть передавать либо всё, либо ничего?
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:15 #8
Цитата Сообщение от allure Посмотреть сообщение
А car a(); работает. А допустим car a (500) нет. Тоесть передавать либо всё, либо ничего?
Можно указать в конструкторе значения по умолчанию. Тогда не все. А так да, все надо указывать
1
stima
492 / 342 / 42
Регистрация: 22.03.2011
Сообщений: 1,104
Завершенные тесты: 2
13.11.2013, 19:17 #9
как понять работает?

Вообщето это
C++
1
car a();
Это обьявление функции))
1
allure
2 / 2 / 0
Регистрация: 13.11.2013
Сообщений: 41
13.11.2013, 19:17  [ТС] #10
Цитата Сообщение от metaluga145 Посмотреть сообщение
Можно указать в конструкторе значения по умолчанию. Тогда не все. А так да, все надо указывать
Всё понял. Огромное спасибо!
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:19 #11
stima, это он у меня взял я типа хотел показать, что там конструктор вызывается) надо было написать car a = car(); Так более понятно)
0
allure
2 / 2 / 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)
    {}
он всё ровно не хочет.
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:45 #13
allure, на что ругается? Кст, не стоит использовать зарезервированные слова(в Вашем коде это pow). Может библиотека math у Вас и не подключена, но все же не стоит.
0
allure
2 / 2 / 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&’
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:56 #15
allure, не уверен, что в с++ short int и int это одно и то же, не смотря на то, что занимает одинаковое количество памяти. У Вас описан параметр как short int, а передаете int. Возможно в этом ошибка, но не уверен.
0
13.11.2013, 19:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2013, 19:56
Привет! Вот еще темы с ответами:

Заголовочный файл или Механизм раздельной компиляции - C++
Здравствуйте в данный момент я изучаю C++. Среда разработки Visual Studio 2010 Столкнулся с понятием заголовочный файл и из чистого...

Не видно определений функций при раздельной компиляции - C++
Описал класс и его наследника в заголовочном файле; самые громоздкие определения функций вынес в отдельные файлы, однако при...

Как создать объект класса с двумя параметрами? - C++
#include &lt;iostream&gt; using namespace std; class rational{ public: rational(int numerator = 0, int denominator =...

Как создать объект класса в динамической памяти? - C++
привет. я так понял, можно создать объект в динамической области памяти. либо просто создать объект обычным способом, но чтобы его...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.