C++ 避免对自定义类使用初始化器列表

C++ 避免对自定义类使用初始化器列表,c++,C++,多年来我一直在用谷歌搜索这个,但没有成功,所以我非常感谢你的帮助 我使用自定义类作为私有变量: private: Location SWCorner; Location NECorner; 在包含Location对象的类的构造函数中,我必须在初始化器列表中为它指定一个值: Territory::Territory(Location InitialPosition) : NECorner(InitialPosition), SWCorner(InitialPosition) { this-

多年来我一直在用谷歌搜索这个,但没有成功,所以我非常感谢你的帮助

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

private:
Location SWCorner;
Location NECorner;
在包含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 InitialPosition) {

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

}
但这会引发一个错误,即没有与位置匹配的函数调用

我想有两种解决方案:

我的不雅 为位置指定默认构造函数 然而,我也不太喜欢第二个,因为我不想给出一个默认的位置

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

谢谢你,祝你一切顺利

替换这个:

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 )
{}
关于风格:

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

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

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

替换此:

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 )
{}
关于风格:

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

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

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

如下所示:

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

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

是的,你找到我了——我在C++之前学会了java!感谢您提供的解决方案和关于风格的建议,我将寻找一些指南。@noctiulux:有一本由Andrei Alexandrescu和Herb Sutter编写的风格指南书。Habor是C++国际标准化委员会主席,安德列是模板专家。据我所知,这本书中唯一可疑的建议是基于当时标准C++03的一个学术问题重新解释cast。可能已经纠正了。无论如何,这不会让你做任何严重的坏事。我认为,根据其他人的说法,它是最好的C++风格指南。确实要花钱-谢谢,听起来不错-我会查的!接下来的问题是:我可以在冒号后面放多个语句吗?例如,定义变量等?@noctilux否。您只需初始化您的成员即可。初始化是按照它们在类中声明的顺序进行的,而不是您在这里键入它们的顺序,即,按照与类相同的顺序进行,以减少意外。好的,谢谢。这也清除了我的重新订购警告!如果我想在设置变量之前进行多行处理,那么我必须指定默认构造函数。有点痛,但没关系!是的,你找到我了——我在C++之前学会了java!感谢您提供的解决方案和关于风格的建议,我将寻找一些指南。@noctiulux:有一本由Andrei Alexandrescu和Herb Sutter编写的风格指南书。Habor是C++国际标准化委员会主席,安德列是模板专家。据我所知,这本书中唯一可疑的建议是基于当时标准C++03的一个学术问题重新解释cast。可能已经纠正了。无论如何,这不会让你做任何严重的坏事。我认为,根据其他人的说法,它是最好的C++风格指南。确实要花钱-谢谢,听起来不错-我会查的!接下来的问题是:我可以在冒号后面放多个语句吗?例如,定义变量等?@noctilux否。您只需初始化您的成员即可。初始化是按照它们在类中声明的顺序进行的,而不是您在这里键入它们的顺序,即,按照与类相同的顺序进行,以减少意外。好的,谢谢。这也清除了我的重新订购警告!如果我想在设置变量之前进行多行处理,那么我必须指定默认构造函数。有点痛,但没关系!嗨,谢谢你的回答-你也回答了这个问题,但是另一个答案提供了更多信息,所以我最后选择了这个。对不起@noctilux一点问题也没有,很高兴你的问题得到了回答:嗨,谢谢你的回答-你也回答了这个问题,但另一个答案提供了更多信息,所以我最终选择了这个答案。对不起@夜光号 没问题,很高兴你的问题得到了回答: