Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 13.11.2013
Сообщений: 41
1

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

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

Author24 — интернет-сервис помощи студентам
Есть 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.11.2013, 19:04
Ответы с готовыми решениями:

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

Как правильно использовать заголовочные файлы при раздельной компиляции в MS Visual Studio?
Если я использую функцию cout и cin в каждом модуле, мне нужно в каждом модуле прописывать :...

Можно ли создать объект класса с таким же именем как у самого класса?
Можно ли создать объект класса с таким же именем как у самого класса? Ну или как то обойти эту...

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

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

Вообщето это
C++
1
car a();
Это обьявление функции))
1
2 / 2 / 0
Регистрация: 13.11.2013
Сообщений: 41
13.11.2013, 19:17  [ТС] 10
Цитата Сообщение от metaluga145 Посмотреть сообщение
Можно указать в конструкторе значения по умолчанию. Тогда не все. А так да, все надо указывать
Всё понял. Огромное спасибо!
0
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:19 11
stima, это он у меня взял я типа хотел показать, что там конструктор вызывается) надо было написать car a = car(); Так более понятно)
0
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
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:45 13
allure, на что ругается? Кст, не стоит использовать зарезервированные слова(в Вашем коде это pow). Может библиотека math у Вас и не подключена, но все же не стоит.
0
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
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
13.11.2013, 19:56 15
allure, не уверен, что в с++ short int и int это одно и то же, не смотря на то, что занимает одинаковое количество памяти. У Вас описан параметр как short int, а передаете int. Возможно в этом ошибка, но не уверен.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
13.11.2013, 20:04 16
2allure Почитайте, что такое конструктор по умолчани, перегруженный конструктор и как с этим все работать, просто видно, что Вы не совсем лавливаете суть о чем речь.
0
2 / 2 / 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);
тоже не работает.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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);
//..
};
1
13.11.2013, 20:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2013, 20:26
Помогаю со студенческими работами здесь

Ошибки в раздельной компиляции
Возникла ошибка при компиляции, Ошибка C3861 spisbyauth: идентификатор не найден ...

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

Создать обЪект класса , у которого в параметрах конструктора объект этого же класса
Вот код: TOgmGraphicsClass = class of TOgmGraphicsBlock; TOgmGraphicsBlock =...

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru