2

我正在用 c++ 制作一个三维矢量类(称为Vector3)。现在,我正在尝试重载流插入运算符 ( <<),以便我可以一次直接打印所有向量的组件。我从MSD复制了 sintax ,但出现 3 个错误。

错误:将“const Vector3”作为“float Vector3:: getX() ”的“this”参数传递会丢弃限定符 [-fpermissive]
错误:将“const Vector3”作为“float Vector3:: getY() ”的“this”参数传递丢弃限定符 [-fpermissive]
错误:将 'const Vector3' 作为 'float Vector3:: getZ ()' 的 'this' 参数传递丢弃限定符 [-fpermissive]

(差异以粗体标记)

Vector3.hpublic 下,我输入了这个函数声明:

friend ostream& operator<<(ostream &os, const Vector3 &vector);

Vector3.cpp中,我实现了它:

ostream& operator<<(ostream& os, const Vector3& vector)
{
    os << "(" << vector.getX() << ", " << vector.getY() << ", " << vector.getZ() << ")" << endl;
    return os;
}

(x, y, z)它应该根据 x、y 和 z 变量打印出类似的内容。

附带说明一下,vector.getX()行不应该使用->点而不是点,因为向量对象是地址指针吗?

4

3 回答 3

7

为您的函数添加const限定符。get...

class Vector3
{
    public:
        float getX() const {return x;};
};

一个-qualified 函数只是意味着您可以在类的实例上const调用它。const在这里,吸气剂不会改变任何东西。但是,如果您不指定,编译器不知道,因此不允许调用可能会更改const变量上的某些内容的函数。

您可以在此处阅读有关const- 正确性的信息。

并且点表示法是正确的,vector不是指针,而是引用(即其他名称的另一个名称Vector3。我认为这种&表示法对于初学者来说可能有点混乱。粗略地说:当你将它应用于变量时,它需要它的地址,当它是类型的一部分时,表示该类型是一个引用。例如,请参见此处此处

于 2012-08-14T13:46:02.207 回答
2

我怀疑您没有将 getX、getY 和 getZ 函数声明为 const。编译器不会让你使用它们,因为它不能确定它们不会改变对象的状态。

您应该能够将他们的声明更改为以下形式:

float Vector3::getX() const
于 2012-08-14T13:48:08.307 回答
1
float Vector3::getX()

必须改为

float Vector3::getX() const
于 2012-08-14T13:47:15.777 回答