# 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{

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

}
int getLength(){
return length;
}
}
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 ||

{

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.
– user33306
Nov 10, 2016 at 21:30
• You need parenthesis on your operator< otherwise the comparisons are made serially Nov 10, 2016 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 Nov 10, 2016 at 21:32
• OK. I also noticed the the < operator code only tests < but the description uses <=.
– user33306
Nov 10, 2016 at 21:34
• I must have changed it whilst copying the code to an editor . Good Spot on . I will make amends Nov 10, 2016 at 21:35

• 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.

It's strange to use a signed type for length, but that appears to be imposed on you by the problem statement, so blame a poor specification for that.

Despite the letters std, <bits/stdc++.h> is not a standard header, so you have a portability bug. Even where it exists, it brings in far more than you need, so get used to including just the headers you need.

Avoid using namespace std; - that deprives you of the benefits of namespacing. If you really can't type std:: where needed, then import just the names you need into the smallest reasonable scope:

void check2()
{
using std::cin;
using std::cout;
using std::endl;
//...
}


Prefer to use initialisers to set members - a good compiler (e.g. g++ -Weffc++) can warn when you forget one:

Box()
: Box{0, 0, 0}
{
}

Box(int length, int breadth, int height)
: length{length},
height{height}
{
}


We can omit the Box(const Box&) constructor, as the compiler-generated one is identical.

Many methods are missing const qualifiers:

int getLength() const;
int getHeight() const;
long long CalculateVolume() const;

bool operator<(const Box& b) const;


check2 is a completely meaningless name; choose a name that demonstrates its purpose. Similarly, what does temp mean to the reader?

When reading input, always check the state of the stream afterwards:

if (!(std::cin >> l >> b >> h)) {
// deal with input error here
}