哪位高手帮我看看这个c++程序为什么没能调用点的值
问题是:定义一个类Cpoint表示一个点的信息。在此基础上编写一个表示三角形类Triangle,用友元函数计算三角形面积和周长。我的程序分成了三个部分,分别为point....
问题是:定义一个类Cpoint表示一个点的信息。在此基础上编写一个表示三角形类Triangle,用友元函数计算三角形面积和周长。
我的程序分成了三个部分,分别为point.h fx.cpp sandc.cpp:
//point.h:
class Cpoint
{
private:
int x1,y1,x2,y2,x3,y3;
public:
void getpoint(int x1,int y1,int x2,int y2,int x3,int y3);
Cpoint();
};
class Triangle:public Cpoint
{
public:
friend double square(int x1,int y1,int x2,int y2,int x3,int y3);
friend double circle(int x1,int y1,int x2,int y2,int x3,int y3);
};
//fx.cpp:
#include <iostream>
#include <math.h>
#include "point.h"
using namespace std;
double s=0,c=0;
Cpoint::Cpoint()
{
x1=1;y1=0;
x2=0;y2=0;
x3=0;y3=1;
}
inline void Cpoint::getpoint(int X1,int Y1,int X2,int Y2,int X3,int Y3)
{
cout<<"please input the first point:x1=";
cin>>X1;
cout<<" y1=";
cin>>Y1;
cout<<"please input the second point:x2=";
cin>>X2;
cout<<" y2=";
cin>>Y2;
cout<<"please input the third point:x3=";
cin>>X3;
cout<<" y3=";
cin>>Y3;
}
double square(int x1,int y1,int x2,int y2,int x3,int y3)
{
s=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))*sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
return s;
}
double circle(int x1,int y1,int x2,int y2,int x3,int y3)
{
c=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))+sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))+sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
return c;
}
//sandc.cpp:
#include <iostream>
#include"fx.cpp"
using namespace std;
int main(int argc, char *argv[])
{
int a1,b1,a2,b2,a3,b3;
Cpoint lancelot;
lancelot.getpoint(a1,b1,a2,b2,a3,b3);
cout<<"square is "
<<square(a1,b1,a2,b2,a3,b3)
<<"\ncirle is "
<<circle(a1,b1,a2,b2,a3,b3);
return 0;
}
谢谢各位大虾啦 展开
我的程序分成了三个部分,分别为point.h fx.cpp sandc.cpp:
//point.h:
class Cpoint
{
private:
int x1,y1,x2,y2,x3,y3;
public:
void getpoint(int x1,int y1,int x2,int y2,int x3,int y3);
Cpoint();
};
class Triangle:public Cpoint
{
public:
friend double square(int x1,int y1,int x2,int y2,int x3,int y3);
friend double circle(int x1,int y1,int x2,int y2,int x3,int y3);
};
//fx.cpp:
#include <iostream>
#include <math.h>
#include "point.h"
using namespace std;
double s=0,c=0;
Cpoint::Cpoint()
{
x1=1;y1=0;
x2=0;y2=0;
x3=0;y3=1;
}
inline void Cpoint::getpoint(int X1,int Y1,int X2,int Y2,int X3,int Y3)
{
cout<<"please input the first point:x1=";
cin>>X1;
cout<<" y1=";
cin>>Y1;
cout<<"please input the second point:x2=";
cin>>X2;
cout<<" y2=";
cin>>Y2;
cout<<"please input the third point:x3=";
cin>>X3;
cout<<" y3=";
cin>>Y3;
}
double square(int x1,int y1,int x2,int y2,int x3,int y3)
{
s=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))*sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
return s;
}
double circle(int x1,int y1,int x2,int y2,int x3,int y3)
{
c=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))+sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))+sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
return c;
}
//sandc.cpp:
#include <iostream>
#include"fx.cpp"
using namespace std;
int main(int argc, char *argv[])
{
int a1,b1,a2,b2,a3,b3;
Cpoint lancelot;
lancelot.getpoint(a1,b1,a2,b2,a3,b3);
cout<<"square is "
<<square(a1,b1,a2,b2,a3,b3)
<<"\ncirle is "
<<circle(a1,b1,a2,b2,a3,b3);
return 0;
}
谢谢各位大虾啦 展开
展开全部
我大概看了一下,有可能错误在这里:
1: 语法错误:
inline void Cpoint::getpoint(int X1,int Y1,int X2,int Y2,int X3,int Y3)
{
cout<<"please input the first point:x1=";
cin>>X1; // 好歹也是 cin>>x1; 小错误吧。。
2: int a1,b1,a2,b2,a3,b3; //这里没有初始化吧。。容易粗错。。
Cpoint lancelot; //这里虽然说调用了构造函数,但是下边,
//在语法改好的情况下,改变了。。。
lancelot.getpoint(a1,b1,a2,b2,a3,b3); //更改坐标值; 有语法错误
3: 最好在构造函数的参数表里边初始化 数据成员;
拿你的例子说就是:
Cpoint::Cpoint():x1(1),y1(0),x2(0),y2(0),x3(0),y3(1)
{}
你的写法,叫赋值,而不是初始化,不知道你理解这两种
写法的实质区别不。。。
在参数列表里边初始化,原因是,如果你写的类是组合类,
也就是说你的类里边,有可能包含了其他类的 对象,
比如说,学生类里边,生日 birthday 就是个 日期对象。。
此时 初始化列表 将调用 birthday 的构造函数,
在释放student 的时候,还会调用析构函数,
而按你的写法纯粹就是赋值了,没调用构造函数,当然也就释放不了
3:
好像vc6 对友元函数支持的不好。。。改用更高版本的vs2005 试试。。
个人愚见。。。祝 君好运。。。
1: 语法错误:
inline void Cpoint::getpoint(int X1,int Y1,int X2,int Y2,int X3,int Y3)
{
cout<<"please input the first point:x1=";
cin>>X1; // 好歹也是 cin>>x1; 小错误吧。。
2: int a1,b1,a2,b2,a3,b3; //这里没有初始化吧。。容易粗错。。
Cpoint lancelot; //这里虽然说调用了构造函数,但是下边,
//在语法改好的情况下,改变了。。。
lancelot.getpoint(a1,b1,a2,b2,a3,b3); //更改坐标值; 有语法错误
3: 最好在构造函数的参数表里边初始化 数据成员;
拿你的例子说就是:
Cpoint::Cpoint():x1(1),y1(0),x2(0),y2(0),x3(0),y3(1)
{}
你的写法,叫赋值,而不是初始化,不知道你理解这两种
写法的实质区别不。。。
在参数列表里边初始化,原因是,如果你写的类是组合类,
也就是说你的类里边,有可能包含了其他类的 对象,
比如说,学生类里边,生日 birthday 就是个 日期对象。。
此时 初始化列表 将调用 birthday 的构造函数,
在释放student 的时候,还会调用析构函数,
而按你的写法纯粹就是赋值了,没调用构造函数,当然也就释放不了
3:
好像vc6 对友元函数支持的不好。。。改用更高版本的vs2005 试试。。
个人愚见。。。祝 君好运。。。
展开全部
inline void Cpoint::getpoint(int X1,int Y1,int X2,int Y2,int X3,int Y3)
{
cout<<"please input the first point:x1=";
cin>>X1;
cout<<" y1=";
cin>>Y1;
cout<<"please input the second point:x2=";
cin>>X2;
cout<<" y2=";
cin>>Y2;
cout<<"please input the third point:x3=";
cin>>X3;
cout<<" y3=";
cin>>Y3;
}
double square(int x1,int y1,int x2,int y2,int x3,int y3)
{
s=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))*sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
return s;
}
double circle(int x1,int y1,int x2,int y2,int x3,int y3)
{
c=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))+sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))+sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
return c;
}
这两个函数要在 class Triangle的定义文件中 进行声明定义 而且也不用声明为友元函数,做成员函数就可以
Cpoint::Cpoint()
{
x1=1;y1=0;
x2=0;y2=0;
x3=0;y3=1;
}
这个也不用这么写, 直接在Cpoin类中定义构造函数时,把x1。。。。。都作为参数。
如Cpoint::Cpoint(int x1,int y1,int x2,int y2,int x3,int y3)
{
x1=1;y1=0;
x2=0;y2=0;
x3=0;y3=1;
}
这样 声明 Cpoint cp=new Cpoint(1,1,2,2,3,3); 即可
把Cpoint类声明为Triangle的友元类,这样在Triangle定义一个Cpoint对象,Triangle类就可以访问这个对象的私有成员,就是3个点的坐标了。把三个点的坐标直接传给那两个函数,计算面积和周长。
{
cout<<"please input the first point:x1=";
cin>>X1;
cout<<" y1=";
cin>>Y1;
cout<<"please input the second point:x2=";
cin>>X2;
cout<<" y2=";
cin>>Y2;
cout<<"please input the third point:x3=";
cin>>X3;
cout<<" y3=";
cin>>Y3;
}
double square(int x1,int y1,int x2,int y2,int x3,int y3)
{
s=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))*sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
return s;
}
double circle(int x1,int y1,int x2,int y2,int x3,int y3)
{
c=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))+sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))+sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
return c;
}
这两个函数要在 class Triangle的定义文件中 进行声明定义 而且也不用声明为友元函数,做成员函数就可以
Cpoint::Cpoint()
{
x1=1;y1=0;
x2=0;y2=0;
x3=0;y3=1;
}
这个也不用这么写, 直接在Cpoin类中定义构造函数时,把x1。。。。。都作为参数。
如Cpoint::Cpoint(int x1,int y1,int x2,int y2,int x3,int y3)
{
x1=1;y1=0;
x2=0;y2=0;
x3=0;y3=1;
}
这样 声明 Cpoint cp=new Cpoint(1,1,2,2,3,3); 即可
把Cpoint类声明为Triangle的友元类,这样在Triangle定义一个Cpoint对象,Triangle类就可以访问这个对象的私有成员,就是3个点的坐标了。把三个点的坐标直接传给那两个函数,计算面积和周长。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询