Оператор ‘<' и несколько значений с помощью функции get, не возвращающий

#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();