# Hackerrank Box It

I decided to solve the Box It! challenge in Hackerrank to improve my C++ knowledge as I'm still new to the language.

Design a class named Box whose dimensions are integers and private to the class. The dimensions are labeled: length $l$ , breadth $b$ , and height $h$.

The default constructor of the class should initialise $l$ ,$b$ ,$h$ and to length, breadth and height .

The parameterized constructor Box(int length, int breadth, int height) should initialize Box's $l$ , $b$ and $h$ to length, breadth and height.

The copy constructor Box(Box B) should set $l$ , $b$ and $h$ to $B$ 's $l$ , $b$ and $h$ respectively.

Apart from the above, the class should have $4$ functions:

• int getLength() - Return box's length
• int getBreadth() - Return box's breadth
• int getHeight() - Return box's height
• long long CalculateVolume() - Return the volume of the box

Overload the operator for the class Box. Box $A \leq$ Box $B$ if:

• $A.l \leq B.l$
• $A.b \leq B.b$ and $A.l == B.l$
• $A.h \leq B.h$ and $A.b == B.b$ and $A.l == B.l$

Overload operator $<<$ for the class Box().

If $B$ is an object of class Box:

$cout << B$ should print $B.l, B.b$ and $B.h$ on a single line separated by spaces.

Constraints

$0 \leq l,b,h \leq 10^5$ Two boxes being compared using the $<$ operator will not have all three dimensions equal.

Here is my code

#include<bits/stdc++.h>
using namespace std;
class Box{

int length, breadth, height;
public:
Box (){
length =0;
breadth = 0;
height =0;
}
Box (int l, int b, int h)
{
length =l;
breadth = b;
height = h;
}
Box(const Box& b){
length =  b.length;
breadth = b.breadth;
height =  b.height;

}
int getLength(){
return length;
}
int getBreadth (){
return breadth;
}
int getHeight(){
return height;
}
long long CalculateVolume(){
return (long long) length * breadth * height;
}

bool operator<(Box& b){

if(this->length <= b.length || this->breadth <= b.breadth && this->length == b.length ||

this->height <= b.height && this->length == b.length && this->breadth == b.breadth)
{

return true;
}
return false;
}
friend ostream& operator<<(ostream &out, const Box &B);

};
ostream& operator<<(ostream  &out, const Box &B){
out<< B.length<<" "<< B.breadth<< " " << B.height;
return out;
}
void check2()
{
int n;
cin>>n;
Box temp;
for(int i=0;i<n;i++)
{
int type;
cin>>type;
if(type ==1)
{
cout<<temp<<endl;
}
if(type == 2)
{
int l,b,h;
cin>>l>>b>>h;
Box NewBox(l,b,h);
temp=NewBox;
cout<<temp<<endl;
}
if(type==3)
{
int l,b,h;
cin>>l>>b>>h;
Box NewBox(l,b,h);
if(NewBox<temp)
{
cout<<"Lesser\n";
}
else
{
cout<<"Greater\n";
}
}
if(type==4)
{
cout<<temp.CalculateVolume()<<endl;
}
if(type==5)
{
Box NewBox(temp);
cout<<NewBox<<endl;
}

}
}

int main()
{
check2();
}


Final thoughts

• I now I shouldn't be using this line of code using namespace std; as recommended in other reviews but Hackerrank had this pre-defined and I couldn't change it. The Check2() and main() were also predefined as well.

• Was the use of friend method an overkill?

• Did I override the operators << and < correctly?
• How can I improve this code?
• Just an fyi, you can change any of the code that Hackerrank supplies. As long as the code will compile, it will accept it. – tinstaafl Nov 10 '16 at 21:30
• You need parenthesis on your operator< otherwise the comparisons are made serially – fernando.reyes Nov 10 '16 at 21:30
• @tinstaafl the code is in a locked editor and I'm only meant to write a class that will be called by the locked editor – Siobhan Nov 10 '16 at 21:32
• OK. I also noticed the the < operator code only tests < but the description uses <=. – tinstaafl Nov 10 '16 at 21:34
• I must have changed it whilst copying the code to an editor . Good Spot on . I will make amends – Siobhan Nov 10 '16 at 21:35

## 1 Answer

• The problem statement defines the less than condition differently.

• I recommend to use tuple<int, int, int> for box dimensions. The default operator< for tuples does exactly what the problem statement asks for.

• The

if (condition)
{
return true;
}
return false;


is a long way to say

return condition;

• this-> is just a noise. You may safely refer to this->length as length.

• An indentation for operator<< is confusing, but I assume it a copy-paste error.

• #include <bits/stdc++.h> is always wrong.