我有一个任务。我需要开发一个友好的 Perimetr 函数,使用公式 P = (2*Sb)/a 计算金字塔的周长,我创建了一个似乎可以解决这个问题的 Perimetr 函数。但是如何为它重载“*”运算符呢?
代码:
#include <iostream>
#include <fstream>
using namespace std;
int counter = 1; // счетчик. Для форматированного вывода экземпляров
class Pyramid {
friend double Perimetr(Pyramid& Sb, Pyramid& a);
public:
double x, h, a; // x - сторона основания, h - высота, a - апофема
Pyramid() {
cout << endl << "--------------------------------------------------" << endl;
cout << "Этот обьект был создан в конструкторе по умолчанию. Область: " << this << endl;
x = h = a = 0;
}
Pyramid(double p, double k, double q) {
cout << endl << "--------------------------------------------------" << endl;
cout << "Этот обьект был создан в конструкторе с параметрами. Область: " << this << endl;
x = p;
h = k;
a = q;
}
Pyramid(Pyramid& obj) {
cout << endl << "--------------------------------------------------" << endl;
cout << "Этот обьект был создан в конструкторе копирования. Область: " << this << endl;
this->x = obj.x;
this->h = obj.h;
this->a = obj.a;
}
void SHOW() {
cout << endl << "--------------------------------------------------" << endl;
cout << " p" << counter << "\tx --> " << x << ";\th --> " << h << ";\ta --> " << a << endl;
}
~Pyramid() {
cout << endl << "--------------------------------------------------" << endl;
cout << "Удаление объекта в области " << this << " деструктором.\n";
}
private:
double Sb = 10;
};
// перегружаю оператор потокового вывода
ostream& operator<<(ostream& os, const Pyramid& pyramid) {
os << pyramid.x << " " << pyramid.h << " " << pyramid.a;
return os;
}
// перегружаю оператор потокового ввода
istream& operator>>(istream& is, Pyramid& pyramid) {
is >> pyramid.x >> pyramid.h >> pyramid.a;
return is;
}
int main() {
setlocale(0, "");
Pyramid p1, p2(2, 4, 6);
p1.SHOW(); counter++;
p2.SHOW(); counter++;
ofstream fout;
fout.open("1.txt");
fout << p1;
fout.close();
cout << endl << "--------------------------------------------------" << endl;
cout << "\tДанные про первый экземпляр класса Pyramid записаны в файл 1.txt";
cout << endl << "--------------------------------------------------" << endl;
ifstream fin;
fin.open("1.txt");
fin >> p2;
fin.close();
cout << endl << "--------------------------------------------------" << endl;
cout << "\tДанные про первый экземпляр класса Pyramid записаны в поля второго объекта.";
cout << endl << "--------------------------------------------------" << endl;
counter = 2;
p2.SHOW();
return 0;
}
double Perimetr(Pyramid& Sb, Pyramid& a)
{
return (2*Sb)/a;
}
错误:
1) E0349 отсутствует оператор "*", соответствующий этим операндам
2) C2677 бинарный "*": не найден глобальный оператор, принимающий тип "Pyramid" (или приемлемое преобразование отсутствует)
嗯,这个函数的声明(这里我再给)
表示此函数需要两个对 type 对象的引用
Pyramid
。据我了解,您认为它接受对具有名称和的类字段的引用,但事实并非如此:)Pyramid
Sb
a
底线是您只需要获取该类的一个实例,并在函数内使用其字段:
PS。最好
private
将这些字段也放入: