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 lengthint getBreadth()
- Return box's breadthint getHeight()
- Return box's heightlong long CalculateVolume()
- Return the volume of the boxOverload 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. TheCheck2()
andmain()
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?
-
\$\begingroup\$ Just an fyi, you can change any of the code that Hackerrank supplies. As long as the code will compile, it will accept it. \$\endgroup\$user33306– user333062016年11月10日 21:30:21 +00:00Commented Nov 10, 2016 at 21:30
-
\$\begingroup\$ You need parenthesis on your operator< otherwise the comparisons are made serially \$\endgroup\$fernando.reyes– fernando.reyes2016年11月10日 21:30:39 +00:00Commented Nov 10, 2016 at 21:30
-
\$\begingroup\$ @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 \$\endgroup\$Tolani– Tolani2016年11月10日 21:32:39 +00:00Commented Nov 10, 2016 at 21:32
-
\$\begingroup\$ OK. I also noticed the the < operator code only tests < but the description uses <=. \$\endgroup\$user33306– user333062016年11月10日 21:34:18 +00:00Commented Nov 10, 2016 at 21:34
-
\$\begingroup\$ I must have changed it whilst copying the code to an editor . Good Spot on . I will make amends \$\endgroup\$Tolani– Tolani2016年11月10日 21:35:42 +00:00Commented Nov 10, 2016 at 21:35
2 Answers 2
The problem statement defines the less than condition differently.
I recommend to use
tuple<int, int, int>
for box dimensions. The defaultoperator<
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 tothis->length
aslength
.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},
breadth{breadth},
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 getBreadth () 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
}