c++ - VS2010中运算符重载和LNK2019错误

标签 c++ visual-c++ operator-overloading

我正在编写一个 Point 类,它包含三个 float 、x y z、一些函数和重载运算符。我按以下形式对运算符进行编码:

inline Point Point::operator+ (Point point)
{
    return Point(x + point.x, y + point.y, z + point.z);
}

inline void Point::operator+= (Point point)
{
   x += point.x;
   y += point.y;
   z += point.z;
}

这是重载这些运算符的正确方法吗?我已经对其进行了测试并且它可以工作,但我已经看到了另一种形式:

inline Point& Point::operator+ (Point& point)
{
    return Point(x + point.x, y + point.y, z + point.z);
}

inline Point& Point::operator+= (Point& point)
{
    x += point.x;
    y += point.y;
    z += point.z;
        return *this;
}

这两种形式有什么区别?

我也可以在我的 Point.cpp 文件中使用运算符,但如果我尝试在 Main.cpp 中使用它,我会收到未解析的外部符号的 lnk2019 错误。奇怪的是,我的函数在定义文件之外工作。让这些运算符在它们定义的文件之外工作,我缺少什么?

最佳答案

第一个运算符应该是

inline Point Point::operator+ (const Point &point) const
{
    return Point(x + point.x, y + point.y, z + point.z);
}

它不应该返回引用,因为构造一个新对象而不是修改现有对象是异常(exception)(一般经验法则)。 const 被添加到函数中,因为不应修改其调用的点。添加对点的引用作为参数,因此不会有不必要的复制

第二个应该是

inline Point& Point::operator+= (const Point& point)
{
    x += point.x;
    y += point.y;
    z += point.z;
    return *this;
}

因为它应该修改现有的点,所以它应该返回一个引用。 const 被添加到参数中,因为它不应该被改变。函数本身不是 const,因为它应该修改点本身。

你得到的链接器错误是因为内联。要么在头文件中提供完整的实现,要么删除内联。

关于c++ - VS2010中运算符重载和LNK2019错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7857076/

相关文章:

C++ 多拷贝赋值运算符

c++ - 消除变量的 const 拷贝

c++ - 创建一个 1 像素的纹理问题。

c++ - 命令处理器已停止工作

c++ - 无法转换参数错误

c++ - 嵌套模板类和全局命名空间中的函数

c++ - memcpy改变指针?

c++ - PROCESSENTERY32 结构中的 szExeFile 给出了一个奇怪的值

operator-overloading - Ada Compiler 放弃通过重载运算符的包的实例化

c++ - 使用重载后增量运算符内部变量的结果重载预增量运算符