1.问题出现的代码:
#include<iostream>
#include<string>
using namespace std;
class Phone
{
public:
string m_pName;
//Phone(){}
Phone(string pName)
{
m_pName = pName;
}
};
class Sheep
{
public:
string m_Name;
Phone m_Phone ;
Sheep(string name, string p_name) //:m_Name(name), m_Phone(p_name)
{
m_Name = name;
m_Phone = p_name;
}
};
void test01()
{
Sheep lan("懒羊羊", "华为");
cout << lan.m_Name << "拿着" << lan.m_Phone.m_pName << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
此时会报如下错误:
2.查了资料了解到:
c++中,在类中定义成员对象时,该成员类对象需要有默认构造函数,以告诉编译器如何将其初始化。由于这里的Sheep类已经构造了有参构造函数,编译器将不会自动构建无参默认函数。
所以可以手动为Phone类添加上无参默认构造函数。即使将 Phone() 实现为空,也能避免编译错误,因为它告诉编译器,Phone 类有一个默认构造函数可以用来初始化 m_Phone 成员变量。
3.实现:
3.1 即将Phone类写为:
class Phone
{
public:
string m_pName;
Phone()
{
}
Phone(string pName)
{
m_pName = pName;
}
};
3.2 或者在Sheep类的初始化列表里实现赋值操作:
class Sheep
{
public:
string m_Name;
Phone m_Phone ;
Sheep(string name, string p_name) :m_Name(name), m_Phone(p_name)
{
m_Name = name;
m_Phone = p_name;
}
};
完整代码为:
#include<iostream>
#include<string>
using namespace std;
class Phone
{
public:
string m_pName;
/*Phone()
{
}*/
Phone(string pName)
{
m_pName = pName;
}
};
class Sheep
{
public:
string m_Name;
Phone m_Phone ;
Sheep(string name, string p_name) :m_Name(name), m_Phone(p_name)
{
}
};
void test01()
{
Sheep lan("懒羊羊", "华为");
cout << lan.m_Name << "拿着" << lan.m_Phone.m_pName << endl;
}
int main()
{
test01();
system("pause");
return 0;
}