另一个构造函数中的对象构造函数?
Object constructor within another constructor?
我对 CPP 还是很陌生,我正在利用我们目前所有的空闲时间尝试新事物。我有 2 个单独的 类 并且我想在 main 中为它们创建一个初始化列表...也许我没有用最好的词来表达它,但是...
有这个:
class Status
{
public:
int x, y;
float angle;
unsigned short hp;
bool isActive;
Status(const int _x, const int _y, const float _angle, const unsigned short _hp, bool _isActive)
: x(_x), y(_y), angle(_angle), hp(_hp), isActive(_isActive){};
};
还有这个:
class Hero
{
std::string name;
Status status;
Hero(const std::string _name, Status &status)
: name(_name), status(x, y, angle, hp, isActive){};
void display()
{
std::cout << "Hero:\t" << name << std::endl;
std::cout << "HP:\t" << Hero::status.hp << std::endl;
std::cout << "Hero is " << Hero::status.isActive ? " active" : " inactive";
std::cout << std::endl;
};
...我最终想做这样的事情...
Hero h = {"Iron Man", {1, 2, 32.9, 100, true}};
请各位大侠指教...
两个问题:
首先不能直接使用Status
成员变量。要解决这个问题,您要么需要正常访问它们,如
Hero(const std::string _name, Status &_status)
: name(_name), status(_status.x, _status.y, _status.angle, _status.hp, _status.isActive)
{}
或者您可以只依赖自动生成的复制构造函数:
Hero(const std::string _name, Status &_status)
: name(_name), status(_status)
{}
第二个问题是表达式 {1, 2, 32.9, 100, true}
导致所谓的 rvalue ,它不能被普通引用捕获。您需要使用右值引用、const
引用或普通的非引用值。真心推荐后者:
Hero(const std::string _name, Status _status)
: name(_name), status(_status)
{}
此代码:
Hero(const std::string _name, Status &status)
: name(_name), status(x, y, angle, hp, isActive){};
应该是:
Hero(const std::string _name, Status status)
: name(_name), status(status){};
可选 status(std::move(status))
.
此外,条件运算符的优先级高于 <<
的行也存在逻辑错误,因此您需要一些括号。
我对 CPP 还是很陌生,我正在利用我们目前所有的空闲时间尝试新事物。我有 2 个单独的 类 并且我想在 main 中为它们创建一个初始化列表...也许我没有用最好的词来表达它,但是...
有这个:
class Status
{
public:
int x, y;
float angle;
unsigned short hp;
bool isActive;
Status(const int _x, const int _y, const float _angle, const unsigned short _hp, bool _isActive)
: x(_x), y(_y), angle(_angle), hp(_hp), isActive(_isActive){};
};
还有这个:
class Hero
{
std::string name;
Status status;
Hero(const std::string _name, Status &status)
: name(_name), status(x, y, angle, hp, isActive){};
void display()
{
std::cout << "Hero:\t" << name << std::endl;
std::cout << "HP:\t" << Hero::status.hp << std::endl;
std::cout << "Hero is " << Hero::status.isActive ? " active" : " inactive";
std::cout << std::endl;
};
...我最终想做这样的事情...
Hero h = {"Iron Man", {1, 2, 32.9, 100, true}};
请各位大侠指教...
两个问题:
首先不能直接使用
Status
成员变量。要解决这个问题,您要么需要正常访问它们,如Hero(const std::string _name, Status &_status) : name(_name), status(_status.x, _status.y, _status.angle, _status.hp, _status.isActive) {}
或者您可以只依赖自动生成的复制构造函数:
Hero(const std::string _name, Status &_status) : name(_name), status(_status) {}
第二个问题是表达式
{1, 2, 32.9, 100, true}
导致所谓的 rvalue ,它不能被普通引用捕获。您需要使用右值引用、const
引用或普通的非引用值。真心推荐后者:Hero(const std::string _name, Status _status) : name(_name), status(_status) {}
此代码:
Hero(const std::string _name, Status &status)
: name(_name), status(x, y, angle, hp, isActive){};
应该是:
Hero(const std::string _name, Status status)
: name(_name), status(status){};
可选 status(std::move(status))
.
此外,条件运算符的优先级高于 <<
的行也存在逻辑错误,因此您需要一些括号。