我正在从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'
请你帮我一把,这样我才能正确学习基础知识?
答案 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;运营商。您不希望用户使用它。