重载流插入运算符?

时间:2012-08-14 13:43:32

标签: c++ operator-overloading iostream

我在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.h中,我输入了这个函数声明:

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()行不应该使用->而不是点,因为矢量对象是地址指针吗?

3 个答案:

答案 0 :(得分:6)

const限定符添加到get...个函数中。

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

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

您可以阅读const - 正确性here

点符号是正确的,vector不是指针,而是引用(即其他Vector3的其他名称。对于我认为的初学者来说,&符号可能有点混乱。粗略地说:当你将它应用于变量时,它需要它的地址,当它是一个类型的一部分时,它意味着类型是一个引用。例如,见{ {3}}或here

答案 1 :(得分:2)

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

您应该能够将声明更改为以下格式:

float Vector3::getX() const

答案 2 :(得分:1)

float Vector3::getX()

必须更改为

float Vector3::getX() const