通过重载'<<<<&#

时间:2014-03-29 17:01:20

标签: c++ class

我正在从C切换到C ++,我有一些基本但令人讨厌的类密码问题。我在这里做了一些研究,但我可能真的很笨,我不能正确使用你的方法,你能帮助我吗?

问题是通过重载'<<'来打印类的私有成员运营商。 我们来看看代码:

在文件Vector.hh

#include <iostream>

class Vector {
double Val1, Val2, Val3;

public:
 void PrintVector(Vector);
    //There is also a constructor but it doesn't really matter
}

在File Vector.cpp中

#include "Vector.hh"
#include <iostream>

void Vector::PrintVector(Vector Wek)
{
  std::cout << Wek.Val1 << Wek.Val2 << Wek.Val3 << std::endl;
}


std::istream& operator >> (std::istream &Strm, Vector &Wek)
{
  //It actually works with no problem so i'll pass it
}


std::ostream& operator << (std::ostream &Strm, Vector Wek)
{
  Vector::PrintVector(Wek);
  return Strm;
}

和main.cpp

#include Vector.hh
#include <iostream>
using namespace std;

int main()
 {
  Vector Vector1;
  cout << endl << " Start " << endl << endl;
  cin >> Vector1;
  cout << Vector1;

}

当我尝试编译g ++时说:

 g++ -c -g -Iinc -Wall -pedantic -o obj/Vector.o src/Vector.cpp
 src/Vector.cpp:12:37: error: no 'void Vector::PrintVector(Vector)' member function declared in class 'Vector'
 void Vector::PrintVector(Vector Wek)
                                 ^
 src/Vector.cpp: In function 'std::ostream& operator<<(std::ostream&, Vector)':
 src/Vector.cpp:29:1: error: 'PrintVector' is not a member of 'Vector'
 Vector::PrintVector(Wek);

make: Fatal error: Command failed for target `obj/Vector.o'

请你帮我一把,这样我才能正确学习基础知识?

3 个答案:

答案 0 :(得分:0)

您的错误很简单。没有对象,您不能使用实例方法。尝试:

Wek.PrintVector();

另外,通过不断的参考传递它,不要复制。

答案 1 :(得分:0)

类函数是静态的,不会在任何特定的类对象上调用,或者它是非静态的,必须在类的实例上调用,该实例可以在函数内部使用。你混合了这种方法。您需要选择以下两个中的一个:

class Vector
{
    static void PrintVector(const Vector& Wek)
    {
    std::cout << Wek.Val1 << Wek.Val2 << Wek.Val3 << std::endl;
    }
};

// to call
Vector::PrintVector(Wek);

class Vector
{
    void PrintVector() const
    {
        std::cout << Wek.Val1 << Wek.Val2 << Wek.Val3 << std::endl;
    }
};

// to call
Wek.PrintVector();

要么是好的,但我更喜欢后者。

另一个问题是如何实现流操作符。此运算符采用流来输出对象。您已将此流称为Strm,但它从未在您的运算符中使用过。您的打印功能硬编码到cout流。

我建议您删除PrintVector功能并按如下方式实现操作符:

class Vector
{
    friend std::ostream& operator << (std::ostream &Strm, const Vector& Wek);

};

std::ostream& operator << (std::ostream &Strm, const Vector& Wek)
{
  Strm << Wek.Val1 << Wek.Val2 << Wek.Val3 << "\n";
  return Strm;
}

现在您可以输出到任何类型的流,例如文件流。您还需要将运算符声明为friend,以允许它访问私有成员。

我将一些参数更改为引用以提高速度,并将endl替换为"\n",这在写入文件时更快(您可以google为什么)。

您可能需要考虑在输出成员之间添加空格,因为这样可以更容易回读。

希望这有帮助。

答案 2 :(得分:0)

执行此操作的一般方法是使operator<<()成为该类的friend函数。好友功能可以访问该类的私有成员。因此operator<<()可以直接访问私有成员进行打印。请参阅sample

定义公共函数PrintVector进行打印是一个坏主意。由于它是公开的,因此用户(使用您的类的开发人员)可能会开始使用它而不是&lt;&lt;运营商。您不希望用户使用它。