@MaratPetrov96

Что не так с кодом на C++?

Пишу код на C++ по учёбе. При тесте, то есть запуске exe файла, выдаёт "_block_type_is_valid(phead- nblockuse)"
File: dbgdel.cpp
Line: 47

Car.h
#pragma once
#include <iostream>
#include <string>
#include <string.h>
#include <stdlib.h>
using namespace std;

const char* def_marka = "Renault";
const int def_power = 150;
float const def_price = 15.15;
const int def_displacement = 1830;

class Car{
	friend double operator+(Car& c1, Car& c2){
	return (c1.cost+c2.cost);
	};
	private:
		const char* marka; //марка авто
		int power; //мощность двигателя в кВт
		float cost; //стоимость в тыс. $
		int displacement; //объём двигателя
	public:
		void setMarka(const char* m){ //метод записи марки
			marka = m;
		}
		operator double () {
		return this->cost;
	}
		//следующие методы записи возвращают false, чтобы прервать цикл ввода
		bool setPower(int pw){ //метод записи мощности
			if (pw > 0 ){
			power = pw;
			return false;
			}
			else{
				return true;
			}
		}
		bool setCost(float p){ //метод записи стоимости
			if (p > 0 ){
			cost = p;
			return false;
			}
			else{
				return true;
			}
		}
		bool setDis(int dis){ //метод записи объём двигателя
			if (dis > 0 ){
			displacement = dis;
			return false;
			}
			else{
				return true;
			}
		}
		std::string getMarka() const { //метод чтения поля марка
		    return marka;
		}
		int getPower() const { //метод чтения поля мощность
			return power;
		}
		float getCost() const { //метод чтения поля стоимость
			return cost;
		}
		int getDis() const { //метод чтения поля объём двигателя
			return displacement;
		}
		~Car(){ //деструктор
			std::cout << "Destructor called for Car of mark " << getMarka() << std::endl;
		}
	public:
		Car(const char* m = def_marka, int pw = def_power, float p = def_price, int dis = def_displacement){ //конструктор по умолчанию
			marka = m;
			power = pw;
			cost = p;
			displacement = dis;
		};
	public:
		void Print() const{ //вывод параметров на экран
			std::cout << "Marka is " << getMarka() << std::endl;
			std::cout << "Price equals " << getCost() << " thousand $" << std::endl;
			std::cout << "Power equals " << getPower() << " kW" << std::endl;
			std::cout << "Displacement equals " << getDis() << " cm3" << std::endl;
		};
		void Input(); //функция ввода параметров, ещё не определена
		};
 
//Car::operator double() {return this->power;};
//operator Car::double() { return this->power; }

inline void Car::Input(){ //функция ввода параметров
		char *marka_ = new char[16];
        std::cout << "Input mark: "; //введите марку авто
        std::cin >> marka_;
        setMarka(marka_);
 
		do{
        std::cout << "Input power (kW): "; //введите мощность авто в кВт
        std::cin >> power;
		} while(setPower(power)); //мощность не может быть неположительной
 
		do{
        std::cout << "Input cost (thousand $): "; //введите стоимости авто в тыс. $
        std::cin >> cost;
		} while(setCost(cost)); //стоимость не может быть неположительной

		do{
		std::cout << "Input displacement (cm3): "; //введите объём двигателя в см3
        std::cin >> displacement;
		} while(setDis(displacement)); //объём двигателся не может быть неположительным
		delete marka_;
    };

Group.h
#include "car.h" //подключение заголовочного файла

class Group{
	public:
		int size;
		Car* array;
	public:
		void PutCar(int i, Car& trans){
			array[i] = trans;
		};
		Car& GetCar(int i){
			return array[i];
		}
		~Group(){ //деструктор
			delete array;
			std::cout << "Destructor called for Group of size " << Size() << std::endl;
		}
	public:
		Group(int size){ //конструктор по умолчанию
			size = size;
			array = new Car[size];
		};
		Car& Group::operator[](int i){
			return array[i];
		}
		operator double (){
		int summ = 0;
		for(int i = 0; i < sizeof(array); i++){
		summ += array[i].getCost();
		}
		return summ/sizeof(array);
		}
		int Size();
		void Print();
};


int Group::Size(){
	return size;
};

void Group::Print(){
	for (int i = 0; i<sizeof(array); i++){
		array[i].Print();
	}
};

main.cpp
#include "group.h" //подключение заголовочного файла

int main(){
	char marks[3][5] = {"Audi","BMW","Ford"};
	int powers[3] = {100,110,120};
	float costs[3] = {16.5,18,19.2};
	int displaces[3] = {1800,1900,1980};
	Group group(3);
	for (int i = 0; i<2; i++){
		group.PutCar(i,Car(marks[i],powers[i],costs[i],displaces[i]));
	}
	//group.Print();
	group[2].Print();
	double price = group.GetCar(0);
	std::cout << price << std::endl;
	double sum = group.GetCar(1)+group.GetCar(2);
	std::cout << sum << std::endl;
return 0;
}
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
for (int i = 0; i<2; i++){
    group.PutCar(i,Car(marks[i],powers[i],costs[i],displaces[i]));
  }

-- заполняет элементы группы 0 и 1
group[2].Print();

-- пытается напечатать элемент группы 2, не заполненный. Думаю, что дело в этом.

Ещё пара глюков:
void Group::Print(){
  for (int i = 0; i<sizeof(array); i++){
    array[i].Print();
  }
};

sizeof работает не так и тут делает не то, что вы ожидаете. Для количества элементов в группе используйте имеющийся в классе Group size.

operator double (){
    int summ = 0;
    for(int i = 0; i < sizeof(array); i++){
    summ += array[i].getCost();
    }

то же самое здесь.

Традиционно добавлю, что правильным было бы использование std::string (в Car) и std::vector (в Group), но подозреваю, что это это было такое задание.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы