Advertisement
MaratPetrov

Studying code

Jan 27th, 2023 (edited)
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.92 KB | Help | 0 0
  1. #pragma once
  2. #include <iostream>
  3. #include <string>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. using namespace std;
  7.  
  8. namespace{
  9. const char* def_marka = "Renault";
  10. const int def_power = 150;
  11. float const def_price = 15.15;
  12. const int def_displacement = 1830;
  13. }
  14.  
  15. class Car{
  16.         friend double operator +(Car& c1, Car& c2); //дружественная оператор, всё равно не даёт доступа к приватным атрибутам
  17.         //задание именно в том, чтобы использовать friend для получения доступа к приватному атрибуту cost
  18.     private:
  19.         const char* marka; //марка авто
  20.         int power; //мощность двигателя в кВт
  21.         float cost; //стоимость в тыс. $
  22.         int displacement; //объём двигателя
  23.     public:
  24.         Car& operator= (const Car& newCar);
  25.         operator double () {
  26.         return this->cost;
  27.     }
  28.         void setMarka(const char* m);
  29.         //следующие методы записи возвращают false, чтобы прервать цикл ввода
  30.         bool setPower(int pw); //метод записи мощности
  31.         bool setCost(float p); //метод записи стоимости
  32.         bool setDis(int dis); //метод записи объём двигателя
  33.         std::string getMarka() const { //метод чтения поля марка
  34.             return marka;
  35.         }
  36.         int getPower() const { //метод чтения поля мощность
  37.             return power;
  38.         }
  39.         float getCost() const { //метод чтения поля стоимость
  40.             return cost;
  41.         }
  42.         int getDis() const { //метод чтения поля объём двигателя
  43.             return displacement;
  44.         }
  45.         ~Car();
  46.         Car(const char* m = def_marka, int pw = def_power, float p = def_price, int dis = def_displacement);
  47.         //Car(const char* m, int pw, float p, int dis);
  48.         void Print() const;
  49.         void Input(); //функция ввода параметров, ещё не определена
  50.         };
  51.  
  52. void Car::setMarka(const char* m){ //метод записи марки
  53.             marka = m;
  54.         }
  55.  
  56. bool Car::setPower(int pw){ //метод записи мощности
  57.             if (pw > 0 ){
  58.             power = pw;
  59.             return false;
  60.             }
  61.             else{
  62.                 return true;
  63.             }
  64.         }
  65.  
  66. bool Car::setCost(float p){ //метод записи стоимости
  67.             if (p > 0 ){
  68.             cost = p;
  69.             return false;
  70.             }
  71.             else{
  72.                 return true;
  73.             }
  74.         }
  75.  
  76. bool Car::setDis(int dis){ //метод записи объёма двигателя
  77.             if (dis > 0 ){
  78.             displacement = dis;
  79.             return false;
  80.             }
  81.             else{
  82.                 return true;
  83.             }
  84.         }
  85.  
  86. Car::~Car(){
  87. std::cout << "Destructor called for Car of mark " << getMarka() << std::endl;
  88. }
  89.  
  90. void Car::Print() const{ //вывод параметров на экран
  91.             cout << "Marka is " << getMarka() << endl;
  92.             cout << "Price equals " << getCost() << " thousand $" << endl;
  93.             cout << "Power equals " << getPower() << " kW" << endl;
  94.             cout << "Displacement equals " << getDis() << " cm3" << endl;
  95.         }
  96.  
  97. Car::Car(const char* m, int pw, float p, int dis){
  98.         marka = m;
  99.         power = pw;
  100.         cost = p;
  101.         displacement = dis;
  102. }
  103.  
  104. void Car::Input(){ //функция ввода параметров
  105.         char *marka_ = new char[16];
  106.         std::cout << "Input mark: "; //введите марку авто
  107.         std::cin >> marka_;
  108.         setMarka(marka_);
  109.  
  110.         do{
  111.         std::cout << "Input power (kW): "; //введите мощность авто в кВт
  112.         std::cin >> power;
  113.         } while(setPower(power)); //мощность не может быть неположительной
  114.  
  115.         do{
  116.         std::cout << "Input cost (thousand $): "; //введите стоимости авто в тыс. $
  117.         std::cin >> cost;
  118.         } while(setCost(cost)); //стоимость не может быть неположительной
  119.  
  120.         do{
  121.         std::cout << "Input displacement (cm3): "; //введите объём двигателя в см3
  122.         std::cin >> displacement;
  123.         } while(setDis(displacement)); //объём двигателя не может быть неположительным
  124.         delete marka_;
  125.     };
  126.  
  127. Car& Car::operator= (const Car& newCar) //оператор присваивания
  128. {
  129.     // do the copy
  130.     //я пытался использовать set, но всё равно не получилось
  131.     marka = newCar.marka;
  132.     power = newCar.power;
  133.     cost = newCar.cost;
  134.     displacement = newCar.displacement;
  135.  
  136.     // return the existing object so we can chain this operator
  137.     return *this;
  138. }
  139.  
  140.  
  141. double operator + (Car& c1, Car& c2)
  142. { return (c1.cost+c2.cost); } //ошибка: оператор не может получить доступа к private атрибуту
  143.  
  144. class Group{
  145.     public:
  146.         int size;
  147.         Car* array;
  148.     public:
  149.         void PutCar(int i, Car& trans);
  150.         Car& GetCar(int i){
  151.             return array[i];
  152.         }
  153.         ~Group();
  154.     public:
  155.         Group(int size){ //конструктор по умолчанию
  156.             size = size;
  157.             array = new Car[size];
  158.         };
  159.         Car& Group::operator[](int i){
  160.             return array[i];
  161.         }
  162.         operator double (){
  163.         int summ = 0;
  164.         for(int i = 0; i < size; i++){
  165.         summ += array[i].getCost();
  166.         }
  167.         return summ/size;
  168.         }
  169.         int Size();
  170.         void Print();
  171. };
  172.  
  173. int Group::Size(){
  174.     return size;
  175. };
  176.  
  177. void Group::Print(){
  178.     for (int i = 0; i<size; i++){
  179.         array[i].Print();
  180.     }
  181.     //array[0].Print();
  182. };
  183.  
  184. void Group::PutCar(int i, Car& trans){
  185.             array[i] = trans;
  186.             //std::vector<Car> arr;
  187.         }
  188.  
  189. Group::~Group(){
  190.     delete array;
  191.     std::cout << "Destructor called for Group of size " << Size() << std::endl;
  192. }
  193.  
  194. const char* car_name = "Toyota";
  195. const int car_power = 140;
  196. const float car_price = 16.1;
  197. const int car_displacement = 1800;
  198. const char* truck_name = "Scania";
  199. const int truck_power = 640;
  200. const float truck_price = 28.1;
  201. const int truck_displacement = 3000;
  202. const float capacity = 2.0;
  203.  
  204. int main(){
  205.     //Car* new_car = new Car();
  206.     char marks[3][5] = {"Audi","BMW","Ford"};
  207.     int powers[3] = {100,110,120};
  208.     float costs[3] = {16.5,18,19.2};
  209.     int displaces[3] = {1800,1900,1980};
  210.     Group group(3);
  211.     for (auto i = 0; i != 3; i++){ //в ходе итерации вызываются деструкторы. Ясно, что дело в уничтожении объекта в процессе итерации.
  212.         Car new_car(marks[i],powers[i],costs[i],displaces[i]);
  213.         //Car new_car(marks[i],powers[i],costs[i],displaces[i]);
  214.         //Car *new_car = new Car(marks[i],powers[i],costs[i],displaces[i]);
  215.         group.PutCar(i,new_car);
  216.         //delete new_car; //не помогает
  217.     }
  218.     group.Print();
  219.     group[0].Print(); //из-за неопределённости оператора присваивания выводятся странные символы - случайные значения
  220.     double price = group.GetCar(0);
  221.     std::cout << price << endl;
  222.     //double sum = group.GetCar(1)+group.GetCar(2);
  223.     //cout << sum << endl;
  224. return 0;
  225. }
Tags: C++
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement