避免对自定义类使用初始化程序列表

Avoid using initialiser list for custom classes

本文关键字:初始化 程序 列表 自定义      更新时间:2023-10-16

我已经尝试在谷歌上搜索了很长时间,但没有成功,所以我真的很感谢你的帮助!

我使用一个自定义类作为私有变量:

private:
Location SWCorner;
Location NECorner;

在包含Location对象的类的构造函数中,我必须在initializer列表中给它一个值:

Territory::Territory(Location InitialPosition) : NECorner(InitialPosition), SWCorner(InitialPosition) {
  this->NECorner = Location(InitialPosition.getX() + 1, InitialPosition.getY() + 1);
  this->SWCorner = Location(InitialPosition.getX() - 1, InitialPosition.getY() - 1);
}

正如你所看到的,我正在做的是将它初始化为某个值,然后立即重新分配该值。这在我看来很难看。我真的很想做:

Territory::Territory(Location InitialPosition) {
  this->NECorner = Location(InitialPosition.getX() + 1, InitialPosition.getY() + 1);
  this->SWCorner = Location(InitialPosition.getX() - 1, InitialPosition.getY() - 1);
}

但这会引发一个错误(Location()没有匹配的函数调用)。

我想有两种解决方案:

  1. 我的不雅
  2. 为Location()指定默认构造函数

然而,我也不太喜欢第二个,因为我真的不想想出一个"默认位置"。

我想我想问的是:还有第三种我不知道的解决方案吗?我是不是忽略了什么?

谢谢,祝你一切顺利!

替换此:

Territory::Territory(Location InitialPosition) : NECorner(InitialPosition), SWCorner(InitialPosition) {
  this->NECorner = Location(InitialPosition.getX() + 1, InitialPosition.getY() + 1);
  this->SWCorner = Location(InitialPosition.getX() - 1, InitialPosition.getY() - 1);
}

这个:

Territory::Territory( Location const& initialPosition)
    : NECorner( InitialPosition.getX() + 1, , InitialPosition.getY() + 1)
    , SWCorner( InitialPosition.getX() - 1, InitialPosition.getY() - 1 )
{}

关于风格:

如果您控制类Location的源代码,我建议您也删除类似Java的get前缀,这些前缀只是C++中的视觉噪声。例如,想想getSin。如果一个标准库函数被命名为getSin,您会非常惊讶。

此外,我建议对类型和实例使用不同的命名约定。

最后,使用this->前缀是非常不习惯的。备选方案包括成员变量的mym前缀,或在Boost库代码中使用的_后缀。

如下所示:

Territory::Territory(Location InitialPosition) :
NECorner(InitialPosition.getX() + 1, InitialPosition.getY() + 1),
SWCorner(InitialPosition.getX() - 1, InitialPosition.getY() - 1) {
}