In: Computer Science
Complete the PoundDog code by adding a constructor having a constructor initializer list that initializes age with 1, id with -1, and name with "NoName". Notice that MyString's default constructor does not get called.
Note: If you instead create a traditional default constructor as below, MyString's default constructor will be called, which prints output and thus causes this activity's test to fail. Try it!
// A wrong solution to this activity... PoundDog::PoundDog() { age = 1; id = -1; name.SetString("NoName"); }
#include <iostream>
#include <string>
using namespace std;
class MyString {
public:
MyString();
MyString(string s);
string GetString() const { return str; };
void SetString(string s) { str = s; };
private:
string str;
};
MyString::MyString() {
cout << "MyString default constructor called" <<
endl;
str = "";
}
MyString::MyString(string s): str(s) {
}
class PoundDog {
public:
PoundDog();
void Print() const;
private:
int age;
int id;
MyString name;
};
/* Your solution goes here */
void PoundDog::Print() const {
cout << "age: " << age << endl;
cout << "id: " << id << endl;
cout << "name: " << name.GetString() <<
endl;
}
int main() {
PoundDog currDog;
currDog.Print();
return 0;
}
> By Using the constructor initializer list, we can add the default constructor without even getting execute the MyString's default constructor. See the below code:
PROGRAM:
#include <iostream>
#include <string>
using namespace std;
class MyString {
public:
MyString();
MyString(string s);
string GetString() const { return str; };
void SetString(string s) { str = s; };
private:
string str;
};
MyString::MyString() {
cout << "MyString default constructor called" <<
endl;
str = "";
}
MyString::MyString(string s): str(s) {
}
class PoundDog {
public:
PoundDog();
void Print() const;
private:
int age;
int id;
MyString name;
};
PoundDog::PoundDog(): id(-1),age(1),name("NoName"){
}
void PoundDog::Print() const {
cout << "age: " << age << endl;
cout << "id: " << id << endl;
cout << "name: " << name.GetString() <<
endl;
}
int main() {
PoundDog currDog;
currDog.Print();
return 0;
}
> In the above code I have used a initializer list:
PoundDog::PoundDog(): id(-1),age(1),name("NoName"){
}
This list executes as the default constructor without calling the MyString's default constructor. It doesn't called MyString's default constructor as I didn't used the method SetString(String s) of the MyString Class.