一个C++的小问题,真烦人啊!!一个<<重载的问题

以下是代码:
#include<iostream>
using namespace std;

class point{
double x;
double y;
public:
point();
point(double tx,double ty);
point(point &p){
cout<<"copy function."<<endl;
x=p.x;
y=p.y;
}
double getx();
double gety();
void print();
friend ostream & operator<<(ostream &stream, point &p);
};
ostream & operator << (ostream &stream,point &p)
{
stream<<"[Point ("<<p.x<<","<<p.y<<")]"<<endl;
return stream;
}
void point::print(){
cout<<"[Point ("<<x<<","<<y<<")]"<<endl;
}
double point::gety()
{
return y;
}
double point::getx()
{
return x;
}
point::point(){
x=0.0;
y=0.0;
cout<<"default constructor."<<endl;
}
point::point(double tx,double ty){
x=tx;
this->y=ty;
cout<<"normal constrator."<<endl;
}
void main(){
point p1(1,1),p2;
cout<<p1<<p2;
}
狂出现:error C2248: 'x' : cannot access private member declared in class 'point'!
完整的输出是:
--------------------Configuration: test3 - Win32 Debug--------------------
Compiling...
Text1.cpp
e:\c++\c++projects\learning\test3\text1.cpp(22) : error C2248: 'x' : cannot access private member declared in class 'point'
e:\c++\c++projects\learning\test3\text1.cpp(5) : see declaration of 'x'
e:\c++\c++projects\learning\test3\text1.cpp(22) : error C2248: 'y' : cannot access private member declared in class 'point'
e:\c++\c++projects\learning\test3\text1.cpp(6) : see declaration of 'y'
e:\c++\c++projects\learning\test3\text1.cpp(48) : error C2593: 'operator <<' is ambiguous
执行 cl.exe 时出错.

test3.exe - 1 error(s), 0 warning(s)

第1个回答  2011-07-03
你在你友元函数里直接访问class point的私有成员 x,y。无法在类外访问私有成员和保护成员,友元函数不是类的组成部分。建议你使用getX,getY函数访问x,y
友元函数写成这样:
ostream & operator << (ostream &stream,point &p)
{
stream<<"[Point ("<<p.getX()<<","<<p.getY()<<")]"<<endl;
return stream;
}追问

用friend 可以访问的...
还有,你那个做法我之前也试过,但是如果没有声明友元的话是可以的;但是,如果有那个Friend的话,.又会出错了.
我想知道真正的原因..

追答

楼上说的有些道理,我用g++编译,可以通过

第2个回答  2011-07-03

你的程序在我的vs2005上面没有问题啊

追问

我用的是这个:Microsoft Visual C++ 6.0
结果就出错了...访问出错等..

第3个回答  2011-07-03
double x;
double y;
前面默认访问权限为private
不能直接用对象访问,你那不是有getx(),gety()函数吗,你可以用对象调用这些函数。追问

用friend 可以访问的...

第4个回答  2011-07-03
根本没问题,清理一下重编译
第5个回答  2011-07-03
HA,vc6.0不支持c++2003的全部标准.扔了吧。追问

那用啥?

追答

vs2010/c++ bulider/code::block
等等。

本回答被提问者采纳

C++ <<重载问题!
Point(int x=0, int y=0) { px=x;py=y;} friend ostream& operator<<(ostream &x,Point pt); \/\/重载"<<"运算符的函数声明 \/\/把void换成ostream& };ostream& operator <<(ostream &x,Point pt) \/\/重载"<<"运算符的函数头 \/\/把void换成ostream& { x<<"("<...

一个关于C++重载的问题
private:int size1;int size2;int *ptr;public:Array2(int m = 3, int n = 4) :size1(m), size2(n)\/*这里改为3×4,是因为这里你把他定为10×10了,它输出的是10×10方阵的前面3行和前面4列 因为你只输入了方阵的第一行的10位和第二行的两位,其余的都没有初始化,会变成随机数...

C++中一个重载的小问题
return 1;} 首先,不管是不是用模板,你的操作符重载都是有问题的,因为没有返回值,<<操作符重载是需要一个ostream&类型的返回值的。其次,建议用typename替代尖括号中的class。至于为什么,以后多看看模板的书就知道了。你的申请友元一定要让类知道这个函数需要的参数,就是<T>,还要让类知道这是一...

c++重载的问题,请高手回答
前者是--号在前面,需要先减然后再把减之后的对象返回,因此直接对源对象进行操作,然后返回源对象就行了。后者是--号在后面,需要返回减之前的值,但是同时也要对源对象进行减操作,但你如果在减之前就直接返回的话,就没法进行减操作了,所以只好先创建一个跟源对象一样的对象,然后对源对象减,然...

请教关于C++中重载的问题1
指针P声明为公有的才能访问,就按友好函数访问的权限解释,因为你在重载函数中用到了Strcmp库函数,而它并不是类String的友好函数,因此是不能访问到指针P的 include <iostream> include<string> using namespace std;class String { public:String(){p=NULL;} String(char *str);friend bool ...

c++重载问题
问题是在你的第八行:A & operator =(A & a)解决:A & operator =(const A & a)分析如下:函数fun在return 类A时,编译器需要在主调函数里创建一个临时类常量,以便能够将它赋值给主调函数里的a1.由于在主调函数里代码是a1=fun(),等号右边是个常量(分析如前),但在等号操作符重载里你...

一个C++重载的问题
Vector::Vector(const Vector & Vec){ Length = Vec();V = new double[ Vec.Length ];for(int i = 0 ; i < Length ; i++ )V[i] = Vec.V[i];} 另外你的operator []操作符建议写两个,分别用于const对象和非const对象:double& operator[](int n){ return V[n]; } double ...

关于C++重载的一个问题求解~~
如,C++本身支持下面的转换 char a = '0';int i = (int)a;或者写成int i = int(a);现在有了如上定义,也有类似的形式了 complex a;double i = double(a);这样可以将类complex的对象转换为double,因为上面的重载提供了这样的转换方法。

c++重载问题,求帮忙看看
改成friend istream& operator>> 然后在函数体最后加一句return input;

c++重载问题
二者最后的结果都是把该数+1,但 前增是要自增后的结果,后增是要自增前的结果,重载前增后增是有区别的 后增参数必须有一个int值,任何值都 可以,只要是int就行 目的是区别前增与后增 试想这样你能区分出哪个是前哪个是后 COpertor& COpertor::operator++()COpertor& COpertor::...

相似回答
大家正在搜