我知道,这是一个好主意,使尽可能多的一类非成员非友尽可能的接口,并且我刚刚意识到,我的3D矢量类“的Vector3”,我可以移动+ =, - =等运营商出的类的,仅留下构造和拷贝赋值运算符

现在的问题是:我应该这样操作是什么样子?我见过很多其他运营商的规范形式,并且已经按照他们的建议,但我还没有看到这些运营商的规范形式。我给什么,我认为它应该是下面。

在次要的问题是:什么是这些运营商甚至叫什么名字?算术赋值运算符?

前的(相关的)代码:

class Vector3 {
public:
    Vector3& operator+=(const Vector3& rhs);
    float x, y, z;
};

Vector3& Vector3::operator+=(const Vector3 &rhs) {
    x += rhs.x;
    y += rhs.y;
    z += rhs.z;

    return *this;
}

我已经把它改为到目前为止:

class Vector3 {
public:
    float x, y, z;
};

Vector3& operator+=(Vector3& lhs, const Vector3& rhs) {
    lhs.x += rhs.x;
    lhs.y += rhs.y;
    lhs.z += rhs.z;

    return lhs;
}
有帮助吗?

解决方案

您有什么对我来说很好。

顺便说一句,当你来到运营商+,是很常见的实现,在+ =的条款。 (创建LHS的副本,然后调用LHS + = RHS并返回结果)

不知道你是否已经知道这一招,但因为你担心实施这些运营商规范的方式,它不能伤害就别提了。 :)

其他提示

您有什么好看。

在基本的方法来思考这个,直观,是要想想你想代码,寻找当你写它像什么。如果在这种情况下,你可以写

Vector v, w;

v += w;
w += v;

等等,你在正确的轨道上。

有很多的经验,帮助好规则;请参阅在C ++ FAQ这个条目获取大量就可以了。

我不会说“尽可能多的界面尽可能的”。没有太多通过使operator+=operator-=等未朋友未构件来获得。

有些人喜欢让每一个功能可能非成员非友元函数抵制使用私有成员变量的诱惑。但是你是一个成年人:你可以写功能作为公众成员,而不是使用私有成员变量。我更知道,功能是联系在一起的类,并使其成为一个公共成员使其明确。

除了注:点击 就个人而言,我发现它的经常OK使用私有成员,而不是公众存取(我知道 - 我会在地狱里燃烧)。不总是! - 但往往结果。 事实上,也有少数情况下,如果你决定你需要它,你不能使转向公共存取以分钟为单位的方式。但是我承认这不是一个流行的观点,我不要求人们遵循的理念。

有具体原因使 certaint 的函数和操作“非朋友,非成员”。例如,操作者<<()中作为“流插入操作符”使用时的不能地由构件,因为你将不得不改变LHS类(流)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top