#c #operator-keyword
#c #оператор-ключевое слово
Вопрос:
Я хочу работать с оператором ‘<‘, но я не знаю, каким может быть решение для этого. Я хочу выполнить действие оператора ‘<‘ (тип которого логический), который сравнивает объем двух блоков. Как мне получить этот результат?
Я также не знаю, как вернуть несколько значений в функции GetBox(), как мне это решить? Я хочу индивидуально возвращать ширину, высоту и глубину.
Вот следующий код:
#include<iostream>
using namespace std;
class Box{
private:
int width;
int height;
int depth;
public:
Box():width(0),height(0),depth(0){};
Box(int w, int h, int d):width(w),height(h),depth(d){};
void BoxVolume();
void SetBox(int w1,int h1,int d1);
int GetBox();
friend ostreamamp; operator<<(ostream amp;exit,const Box amp;A);
Box operator<(Boxamp;);
};
void Box::SetBox(int w1,int h1,int d1){
width=w1;
height=h1;
depth=d1;
}
int Box::GetBox(){
return width,height,depth;
}
void Box::BoxVolume(){
cout<<"Volume: "<<width*height*depth<<endl;
}
ostreamamp; operator<<(ostream amp;exit, const Box amp;B){
Box temp2;
exit<<B.width<<" "<<B.height<<" "<<B.depth<<" "<<endl;
return exit;
}
Box Box::operator<(Box amp;K){
}
int main(){
Box Box1;
cout<<"Details about first box:"<<endl;
Box1.SetBox(1,3,5);
Box1.GetBox();
cout<<Box1;
Box1.BoxVolume();
cout<<endl;
Box Box2;
cout<<"Details about second box:"<<endl;
Box2.SetBox(2,4,6);
Box2.GetBox();
cout<<Box2;
Box2.BoxVolume();
}
Комментарии:
1. Возвращать
Box
изoperator <
вместоtrue
илиfalse
не имеет смысла.2. Из какой функции вы хотите вернуть несколько значений? Способы решения этой проблемы могут быть разными.
3. Пожалуйста, объясните, что вы хотите
operator<
иметь в виду дляBox
.4. @Yksisarvinen посмотрите на его метод GetBox.
5. О, точно.
std::array<int, 3>
в качестве возвращаемого типа был бы вариант, но на данный момент почему бы вам просто не сделатьwidth
,height
иdepth
общедоступными? Эти элементы уже доступны.
Ответ №1:
Как вы сказали, operator< должен возвращать логическое значение, и, следовательно, сигнатура функции должна быть:
bool operator<(const Box amp;other) const;
Если вы хотите сравнить объемы, вы должны создать функцию, которая возвращает вычисленный объем:
int getVolume() const { return width * height * depth; }
С помощью этого вы можете легко реализовать функцию сравнения:
bool Box::operator<(const Box amp;other) const {
return getVolume() < other.getVolume();
}
И нет, вы не можете возвращать более одного значения из функции. Если вы хотите это сделать, вам нужно определить структуру, содержащую несколько значений, и вместо этого вернуть экземпляр этой структуры.
Комментарии:
1. Я хотел вернуть индивидуально ширину, высоту и глубину, так что, похоже, я имею отношение к структуре? Я попробую это сравнение и дам вам знать, если у меня возникнут какие-либо дополнительные вопросы.
2. Если вы хотите возвращать их по отдельности, лучше всего реализовать методы getWidth, getHeight и getDepth. Хотя может возникнуть соблазн сделать все с помощью одной строки кода, на самом деле это ухудшает читаемость кода в большинстве случаев использования.
3. Да, очень непрактично использовать метод get для каждого размера отдельно, можете ли вы обновить этот метод GetBox структурой для ширины, высоты и глубины? А затем возвращающий эту структуру для всех 3 значений. Я был бы очень благодарен.
4. Почему? Что более практично делать:
auto dimensions = box.GetBox(); int width = dimensions.width;
поверх этого?int width = box.getWidth();
Вы запрашиваете что-то, что на самом деле усложнило бы ваш код.5. Чтобы было ясно, нет способа достичь Pythonic:
w, h, d = box.getDimensions();