注册 登录
编程论坛 C++教室

请教一个点运算符方面的报错。

yangfrancis 发布于 2015-01-22 15:15, 1008 次点击
#include<iostream>
using namespace std;
class Point                   //定义点类,成员变量为平面内两个坐标值
{
public:
    void SetPos(int m, int n){x=m;y=n;}
    int GetX(){return x;}
    int GetY(){return y;}
private:
    int x; int y;
};
class Circle                  //定义圆形类,成员变量一为点类的圆心,一为整型的半径
{
public:
    Circle
    Circle(Point, double);
    Circle(int, int, double);
    ~Circle(){};
    void SetCenter(Point c){Center=c;}
    void SetRadius(double r){Radius=r;}
    Point GetCenter(){return Center;}
    double GetRadius(){return Radius;}
private:
    Point Center;
    double Radius;
};
Circle::Circle()
{
    Point p;p.SetPos(0,0);SetCenter(p);SetRadius(10);
}
Circle::Circle(Point c, double r)
{
    SetCenter(c);SetRadius(r);
}
Circle::Circle(int x=0, int y=0, double r=10)
{
    Point p;
    p.SetPos(x,y);
    SetCenter(p);
    SetRadius(r);
}
void main()
{
    Circle MyCircle();
    cout<<"圆的坐标:"<<(MyCircle().GetCenter).GetX<<endl;
//报错就在上面这行,说是error C2228: left of '.GetX' must have class/struct/union type
//执行 cl.exe 时出错.
}

为什么它不承认这里的(MyCircle().GetCenter)是一个Point类呢?我试了在GetX后加上()还是一样的报错。请各位老师帮忙看一看。谢谢。
14 回复
#2
yangfrancis2015-01-22 15:19
我是想通过圆形类的公有成员函数得到圆心,再调用圆心所属的Point类的成员函数来输出圆心横坐标,但为什么会这样?
#3
wp2319572015-01-22 15:32
我猜的:
你的circle 类和point 类 貌似是平级类吧  那样的话 circle是无法调用point里的getx gety
#4
rjsp2015-01-22 15:39
代码错误太多了,前面的不说,只说main函数之内的

Circle MyCircle(); 这是声明的一个函数,但函数的定义在哪儿呢?
(MyCircle().GetCenter).GetX 这又是什么?怀疑是 MyCircle().GetCenter().GetX()

如果 Circle MyCircle() 是写错了,本来想写的是 Circle MyCircle;
那 (MyCircle().GetCenter).GetX 也应该是 MyCircle.GetCenter().GetX()

从头看到尾,建议你换本书,这不是一两个小知识点的问题,而是类的设计就不是C++的味儿
#5
yang_guang_v2015-01-22 15:46
#include"stdio.h"
#define N 20
void ModEuler(float(*f)(float,float),float x0,float y0,float xn,int n)
{ int i;
float yp,yc ,x=x0,y=y0,h=(xn-x0)/n;
printf("x[0]=%f\ty[0]=%f\n",x,y);
for(i=1;i<=n;i++)
{
yp=y+h*(*f)(x,y);
x=x0+i*h;
yc=y+h*(*f)(x,yp);
y=(yp+yc)/2;
printf("x[%d]=%f\ty[%d]=%f\n",i,x,i,y);
}
}
float f(float x,float y)
{
return-x*x*y*y*y;
}
void main()
{
float xn=5,x0=0,y0=1;
ModEuler(f,x0,y0,xn,N);
}
请问怎么把这个程序的运行结果复制到文本文档?
#6
wp2319572015-01-22 15:47
这孩子,怎么跑人家的主贴下面来问问题了
#7
yangfrancis2015-01-22 17:30
回复 3楼 wp231957
公有成员平级也不能调用啊?
#8
yangfrancis2015-01-22 17:35
回复 3楼 wp231957
Circle MyCircle()这句我自己也觉得很怪异,本来是用的Circle MyCircle,但又被报错说不知道该调用哪个构造函数。“ambiguous call to overloaded function”。加上括号之后,这句不报错,后面一句又报错了。
#9
yangfrancis2015-01-22 17:45
回复 4楼 rjsp
Circle::Circle()
{
    Point p;p.SetPos(0,0);SetCenter(p);SetRadius(10);
}
这里算对前面声明的函数定义了么?(弱弱地问一句)
#10
yangfrancis2015-01-22 17:54
Circle MyCircle();
cout<<"圆的坐标:"<<(MyCircle().GetCenter).GetX<<endl;
我刚才试过了,main函数的上面两句去掉,改为下面两句
Circle MyCircle(0,0,10);
cout<<"圆的坐标:"<<MyCircle.GetCenter().GetX()<<endl;
这样就不再报错了。但有一点还没明白,我前面已定义过了不带参的构造函数Circle(),为什么不能用Circle MyCircle呢?
(这上面贴出的代码声明构造函数时不小心弄掉了括号,但我实际写的代码确实加了括号的)
public:
   Circle();
是这样的。为什么建立对象时不允许我不写参数?
#11
yangfrancis2015-01-22 21:17
Circle::Circle(int x=0, int y=0, double r=10)
我发现把这个构造函数里面的参数缺省值全部去掉之后,Circle MyCircle;就可以通过编译了。请问各位有没有人能说一下是怎么回事?本来是调用不带参的构造函数,但编译能不能通过又跟三个参数的构造函数相关,听起来好诡异啊。
#12
wp2319572015-01-23 09:46
简化一下如何?

程序代码:

#include<iostream>

using namespace std;

class point                  
{
public:
    void setpos(int m, int n){x=m;y=n;}
    int getx(){return x;}
    int gety(){return y;}
private:
    int x; int y;
};
class circle :public point   
{
public:
    circle();
    ~circle(){};
};
circle::circle()
{
    setpos(100,10);
}

void main()
{
    circle mycircle;
    cout<<"获得初始坐标:"<<mycircle.getx()<<","<<mycircle.gety()<<endl;
    mycircle.setpos(15,25);
    cout<<"获得更改坐标:"<<mycircle.getx()<<","<<mycircle.gety()<<endl;

}
#13
yangfrancis2015-01-24 13:16
谢谢关注。不重载构造函数倒确实没问题。也许是因为先前我的第三个重载构造函数所有参数都给了缺省值,编译器认为这种情况和缺省掉参数是一样的,因此报错。
#14
ITCD2015-01-25 16:38
回复 11楼 yangfrancis
原因很简单,类是用来复用代码的,你在构造里面就往内存丢东西,这个相信C++的老爹不答应
#15
ITCD2015-01-25 16:39
回复 11楼 yangfrancis
另外你的代码可读性应该优化下,一步能解决的,就不要绕几大圈子。
1