我的问题在第72行。为什么我们可以在第81行执行相同的操作而不会出现任何错误?如果我们声明一个需要将参数传递给其类构造函数的对象,是否应该执行任何首选项?
#include<iostream>
using namespace std;
class clsPerson
{
string _FullName;
class clsAddress
{
private:
string _AddressLine1;
string _AddressLine2;
string _City;
string _Country;
public:
clsAddress(string AddressLine1, string AddressLine2, string City, string Country)
{
_AddressLine1 = AddressLine1;
_AddressLine2 = AddressLine2;
_City = City;
_Country = Country;
}
string setAddressLine1(string AddressLine1)
{
_AddressLine1 = AddressLine1;
}
string AddressLine1()
{
return _AddressLine1;
}
string setAddressLine2(string AddressLine2)
{
_AddressLine2 = AddressLine2;
}
string AddressLine2()
{
return _AddressLine2;
}
string setCity(string City)
{
_City = City;
}
string City()
{
return _City;
}
string setCountry(string Country)
{
_Country = Country;
}
string Country()
{
return _Country;
}
void Print()
{
cout << "\nAddress:\n";
cout << _AddressLine1 << endl;
cout << _AddressLine2 << endl;
cout << _City << endl;
cout << _Country << endl;
}
};
public:
string setFullName(string FullName)
{
_FullName = FullName;
}
string FullName()
{
return _FullName;
}
clsAddress Address = clsAddress("", "", "", "");
// why i can't replace line 71 with => clsAddress Address ("", "", "", "");
clsPerson(string FullName, string AddressLine1, string AddressLine2, string City, string Country)
{
_FullName = FullName;
Address = clsAddress(AddressLine1, AddressLine2, City, Country);
}
};
int main()
{
clsPerson Person1 ("Mohammed Abu-Hadhoud", "Building 10", "Queen Rania Street", "Amman", "Jordan");
clsPerson Person1 = clsPerson ("Mohammed Abu-Hadhoud", "Building 10", "Queen Rania Street", "Amman", "Jordan");
Person1.Address.Print();
return 0;
}
我尝试了两种方法,它们在类外都是正确的,但如果我在类内声明一个对象,编译器只接受一种方法。
您不能在声明中直接使用 括号 来初始化类成员,但可以使用 花括号 来代替:
class clsPerson
{
...
clsAddress Address {"", "", "", ""};
...
};
我建议给
clsAddress
一个默认构造函数,并让编译器为您将 std::string
成员初始化为空字符串:
class clsAddress
{
...
public:
clsAddress() = default;
...
};
class clsPerson
{
...
clsAddress Address;
...
};
此外,您的代码中还有一些关于缺少
return
语句的警告。你的 setter 都不应该声明返回类型,请使用 void
代替,例如:
void setAddressLine1(string AddressLine1)
{
_AddressLine1 = AddressLine1;
}
// etc ...