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