@MaratPetrov96

Что не так с функцией на C++?

Делаю лабораторную а тему массивов и полиморфизма в C++. Часть текста задания:

"Определим в объекте Group две функции с одинаковым именем, например double Age(); и double Age(int limit);. Первая функция пусть возвращает средний возраст группы людей, а вторая функция пусть возвращает средний возраст людей в группе, возраст которых не больше некоторого граничного значения limit. Функции отличаются списком аргументов."

Код с классом объектов массива
#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{
	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{ //вывод параметров на экран
			cout << "Marka is " << getMarka() << endl;
			cout << "Price equals " << getCost() << " thousand $" << endl;
			cout << "Power equals " << getPower() << " kW" << endl;
			cout << "Displacement equals " << getDis() << " cm3" << 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_;
    };


Код с массивом, в нём-то и фишка

#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];
		};
		operator double (){
		int summ = 0;
		for(int i = 0; i < sizeof(array); i++){
		summ += array[i]->cost;
		}
		return summ/sizeof(array);
		}
		operator double (int limit){
		int summ = 0;
		int count = 0;
		for(int i = 0; i < sizeof(array); i++){
			if (array[i]->cost<=limit){
		summ += array[i]->cost;
		count += 1;
			}
		}
		return summ/count;
		}
		int Size();
		void Print();
};


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

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


Главный файл

#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<3; i++){
		group.PutCar(i,Car(marks[i],powers[i],costs[i],displaces[i]));
	}
	group.Print();
	double price = group.GetCar(0);
	cout << price << endl;
return 0;
}


Ошибки при компиляции

error C2835: user-defined conversion 'operator`double'' takes no formal parameters
error C2333: 'operator`double'' : error in function declaration; skipping function body

В принципе, понимаю. что нужно сделать, так как знаком с перегрузкой операторов в Python
  • Вопрос задан
  • 165 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
error C2835: user-defined conversion 'operator`double'' takes no formal parameters

Он говорит тебе о том, что такая перегрузка: operator double (int limit) невозможна. Вторая ошибка -- это следствие первой.

Определим в объекте Group две функции с одинаковым именем, например double Age(); и double Age(int limit);.

Так бы и сделал, зачем оператор для этого перегружать?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы