@MaratPetrov96

Почему нет доступа к приватному атрибуту?

В лабораторной по C++ не получается нормально использовать friend для перегрузки оператора сложения.

group - это класс для массива автомобилей, там всё нормально

Сокращённая версия кода работы

car.h

class Car{
        friend double operator+(Car& c1, Car& c2);
	private:
		const char* marka; //марка авто
		int power; //мощность двигателя в кВт
		float cost; //стоимость в тыс. $
		int displacement; //объём двигателя:
	public:
		operator double () {
		return this->cost;
	}
		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;
		};


car.cpp

Car::Car(const char* m, int pw, float p, int dis){
		marka = m;
		power = pw;
		cost = p;
		displacement = dis;
}
double operator + (Car& c1, Car& c2)
{ return (c1.cost+c2.cost); }


main.cpp

int main(){
        double price = group.GetCar(0);
        std::cout << price << endl;
	double sum = group.GetCar(1)+group.GetCar(2);
	cout << sum << endl;
return 0;
}


Ошибка при попытке создать exe файл

error C2248: 'cost' : cannot access private member declared in class 'Car'

Использую Visual C++ 6.0

UPD: дружественные функции нужно использовать по заданию
  • Вопрос задан
  • 185 просмотров
Пригласить эксперта
Ответы на вопрос 3
У вас оператор является private членом класса. А надо public. О чем и говорит компилятор.
Ответ написан
@dima20155
you don't choose c++. It chooses you
Добавлять дружественные функции/классы, довольно плохая идея с точки зрения архитектуры.
Добавьте просто методы getCost() setCost(float) и уберите ненужных друзей.
Если по какой-то неведомой причине хотите сохранить дружественный класс, то проверьте, что у вас правильная сигнатура функции и вы сохранили файл после последних изменений.
Ответ написан
@code_panik
Пожалуйста, приводите в вопросах содержимое файлов с кодом полностью. Без полных листингов нельзя точно сказать, в чем проблема.
Обратите внимание, что для вызова operator+(Car& c1, Car& c2) функция GetCar должна возвращать Car&, а не Car или const Car& (только не возвращайте ссылку на переменную, объявленную внутри функции).
Замените везде operator+(Car& c1, Car& c2) на operator+(const Car& c1, const Car& c2).
Работающий пример.
И замените, по возможности, компилятор на более современный.
Ответ написан
Ваш ответ на вопрос

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

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