【问题标题】:Overloading the stream insertion operator?重载流插入运算符?
【发布时间】:2012-08-10 19:45:16
【问题描述】:

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

【问题讨论】:

  • getX()const 成员函数吗?
  • 你的operator&lt;&lt; 不需要是friend,如果它只调用Vector3 的公共成员函数。
  • 就您的旁注而言,不应该 - vector 参数不是指针(在语法上),它是一个引用。引用变量与值变量具有相同的“点”语法。

标签: c++ operator-overloading iostream


【解决方案1】:

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

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

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

您可以阅读const-正确性here

并且点表示法是正确的,vector 不是一个指针,而是一个引用(即其他一些Vector3 的另一个名称。&amp;我认为对于初学者来说符号可能有点混乱。粗略地说:当你将它应用到一个变量时,它会获取它的地址,当它是一个类型的一部分时,这意味着该类型是一个引用。例如,参见 herehere .

【讨论】:

  • 啊,我明白了。制作函数const 到底是做什么的?需要详细说明吗?
  • 如果我需要在类的非 const 实例中调用 getX() 怎么办?
  • 在这种情况下,非 const 总是可以安全地隐式转换为 const,也就是说它可以正常工作
  • @DantheMan 将函数设为 const 意味着其 this 指针的类型为 T const*,而不是 T*。这也意味着您可以在 const 实例上调用该函数,或者通过指针或对 const 的引用来调用该函数。但是,通过非常量实例、引用或指针调用它没有问题,因为自然发生的 T* 会隐式转换为 T const*
【解决方案2】:

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

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

float Vector3::getX() const

【讨论】:

    【解决方案3】:
    float Vector3::getX()
    

    必须改为

    float Vector3::getX() const
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多