今天写程序时遇到的问题,谭c++说是去掉using namesapce std;改#include<iostream> 为#include<iostream.h>,这个方法也是可以的,但就是要是你用到其他的stl中的东西,你就必须要加std::,或许还会有其他的问题,反正就是很麻烦。然后到网上去搜了下这个问题的解决方案,还是有好几种方法的,作为参考:
经过测试发现第一种方法是不行的,第二种方法是可以的。搞了好几个小时,55555555
-----------------------------------------------------------------------------------------------------------------------------------
在 C++ 中,操作符(运算符)可以被重载以改写其实际操作。
同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成员,
这个定义通常在头文件中完成。
在Visual C++中定义一般的函数为朋友函数通常是没有问题的。
然而对某些重载操作符的函数,
即使我们将它们定义为类的朋友函数,VC的编译器仍然会显示出错信息,
认为这些朋友函数无权访问类的私有成员。
我认为这应该是VC6.0的bug。
以下代码就是个例子:
// 头文件 “Sample.h” |
// 实现文件 “Sample.cpp” |
以上代码在gnuc++中编译运行毫无问题。但是在VC++6.0中编译的时候就会出现以下的编译错误:
Compiling%26#8230; Sample.cpp c:/temp/sample.cpp(8) : error C2248: %26#8216;x%26#8217; : cannot access private member declared in class %26#8216;Sample%26#8217; c:/temp/sample.h(19) : see declaration of %26#8216;x%26#8217; c:/temp/sample.cpp(13) : error C2248: %26#8216;x%26#8217; : cannot access private member declared in class %26#8216;Sample%26#8217; c:/temp/sample.h(19) : see declaration of %26#8216;x%26#8217; Error executing cl.exe.Sample.obj - 2 error(s), 0 warning(s) |
在VC++ 6.0中解决这个问题有以下几种方法:
- 在头文件中实现作为朋友函数的操作符函数的重载,也就是说在实现文件”Sample.cpp”中将函数重载的实现去掉,而将头文件修改如下:
// 修改后的头文件 1 “Sample.h”
#include
using namespace std;
class Sample {
public:
Sample();
friend ostream %26amp;operator<<(ostream %26amp;out, const Sample s);
friend ostream %26amp;operator<<(ostream %26amp;out, const Sample s) {
cout << s.x << endl;
return out;
}
friend istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s);
friend istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s) {
cout<<”Please enter a value”<> s.x ;
return in;
}
private:
int x;
}; - 在头文件中类定义之前将类和朋友操作符函数的原型特别声明一下,也就是将头文件修改如下(实现文件”Sample.cpp”不用作任何修改):
// 修改后的头文件 2 “Sample.h”
#include
using namespace std;
// 以下3行代码为新加入
class Sample;
ostream %26amp;operator<<(ostream %26amp;out, const Sample s);
istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s);
class Sample {
public:
Sample();
friend ostream %26amp;operator<<(ostream %26amp;out, const Sample s);
friend istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s);
private:
int x;
}; - 第三种方法是对I/O名空间的使用实行明确声明,也就是说在头文件”Sample.h”中直接写:
#include
using std::ostream;
using std::istream
%26#8230;.
取代 “using namespace std;”
注 意:在这个例子里我们在实现文件 “Sample.cpp”中包含 “using namespace std;”这句话,否则在实现中就不能使用 “cout” , “cin”, “<< “, “>>” 和 endl 这些关键字和符号。修改后的完整代码如下:// Sample.h
#include
using std::istream;
using std::ostream;
class Sample {
public:
Sample();
friend ostream %26amp;operator<<(ostream %26amp;out, const Sample s);
/*friend ostream %26amp;operator<<(ostream %26amp;out, const Sample s) {
cout << s.x << endl;
return out;
}*/
friend istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s);
/*friend istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s) {
cout<<”Please enter a value”<> s.x ;
return in;
}*/
private:
int x;
};// “Sample.cpp”
#include “Sample.h”
using namespace std;
Sample::Sample() {
x=5;
}
istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s) {
cout<<”Please enter a value”<> s.x ;
return in;
}
ostream %26amp;operator<<(ostream %26amp;out, const Sample s) {
cout << s.x << endl;
return out;
}