| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦   
共有 689 人关注过本帖
标题:急求 “友员函数”程序的错误
收藏  订阅  推荐  打印
zhonglai123
Rank: 1
等级:新手上路
帖子:13
积分:244
注册:2008-7-23
急求 “友员函数”程序的错误

哪位大虾 能给我看一下这个程序 这个程序的目的是向求两点间的距离 通过定义“点”定义两个点的对象通过友员函数来同时访问两个点 编译没有错误但是 在连接的是侯它提示有一处错误
//程序1
#include<iostream.h>
#include<math.h>
class point
{
public:
    point(double a,double b)
    {
           x=a;y=b;
      cout<<""point:("<<x<<","<<y<<")"<<endl;
    }
    friend double distance(point &p1,point &p2);
    
public:
    double x,y;
};

double disatance(point &p1,point &p2)
{
    double dex,dey;
    dex=p1.x-p2.x;
    dey=p1.y-p2.y;
    return  sqrt(dex*dex+dey*dey);
}

void main()
{
    point p1(1,2);
    point p2(2,3);
    cout<<"两点间的距离是:"<<distance(p1,p2)<<endl;
}

下面这个程序 第一次新建工程运行可以通过结果为“中国软件开发实验室www.cndev-lab.com”但 在这个工程的基础上再建一个工程 运行最上面那个程序1(还是显示连接错误)后 在运行程序2 程序2就开始出错了 错误和程序一的一样。我很不明白为什么同一个程序 却出现了两种情况呢
有些人说程序一那种用法不对 但是程序2和1几乎是一样的为什么 2可以通过而一不可以呢?
还有一个问题是 像disatance(point &p1,point &p2) 这样带两个参量的应该怎么处理 当然带一个不会出错的


//程序2
#include <iostream>

class Internet
{
public:
Internet(char *name,char *address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
friend void ShowN(Internet &obj,Internet,&obk);//友元函数的声明
public:
char name[20];
char address[20];
};


void ShowN(Internet &obj,Ineternet &obk)//函数定义,不能写成,void Internet::ShowN(Internet &obj)
{
cout<<obj.name<<obk.address<<endl;
}
void main()
{
Internet a("中国软件开发实验室","www.cndev-lab.com");
Internet b("中国软件开发实验室","www.cndev-lab.com");
ShowN(a,b);

}
2008-7-23 19:55
sunkaidong
Rank: 12Rank: 12Rank: 12
等级:版主
帖子:4121
积分:44769
威望:4
来自:南京师范大学
注册:2006-12-28

#include "stdafx.h"
#include"iostream"
#include<cmath>
using std::cout;
using std::endl;
class point1
{
public:
    point1(double a,double b)
    {
     x=a;
     y=b;
     cout<<"point1:("<<x<<","<<y<<")"<<endl;
    }
    friend double distance(point1 &p1,point1 &p2);
   
private:
    double x,y;
};

double distance(point1 &p1,point1 &p2)
{
    double dex,dey;
    dex=p1.x-p2.x;
    dey=p1.y-p2.y;
    return  sqrt(dex*dex+dey*dey);
};

int main()
{
    point1 p1(1,2);
    point1 p2(2,3);
    cout<<"两点间的距离是:"<<distance(p1,p2)<<endl;
    system("pause");
    return 0;
}

学习需要安静。。海盗要重新来过。。
2008-7-23 21:00
sunkaidong
Rank: 12Rank: 12Rank: 12
等级:版主
帖子:4121
积分:44769
威望:4
来自:南京师范大学
注册:2006-12-28

空间有污染。。。因为空间里面好像有point类了

学习需要安静。。海盗要重新来过。。
2008-7-23 21:10
lindayanglong
Rank: 2
等级:注册会员
帖子:83
积分:1036
注册:2008-3-9

楼上的,我试了用point也可以呀
2008-7-24 11:54
lindayanglong
Rank: 2
等级:注册会员
帖子:83
积分:1036
注册:2008-3-9

大家把他的第二各程序改改看 ,我怎么改不对啊
#include <iostream>
#include<string>
using namespace std;
class Internet
{
public:
Internet(char *name,char *address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
friend void ShowN(Internet &obj,Internet &obk);//友元函数的声明
private:
char name[20];
char address[20];
};


void ShowN(Internet &obj,Ineternet &obk)//函数定义,不能写成,void Internet::ShowN(Internet &obj)
{
cout<<obj.name<<obk.address<<endl;
}
void main()
{
Internet a("中国软件开发实验室","www.cndev-lab.com");
Internet b("中国软件开发实验室","www.cndev-lab.com");
ShowN(a,b);

}
2008-7-24 12:08
zhonglai123
Rank: 1
等级:新手上路
帖子:13
积分:244
注册:2008-7-23
回复 2# sunkaidong 的帖子

谢谢啊
不过我还有几个疑问向你请教一下
你写的这个程序有很多地方我还没有学到 例如“using std::cout;
using std::endl;system("pause");”我的这个程序的目的是想通过创建连个对象来得到两个点 然后求出两点间的距离 这个程序的思路是从“清华大学出版社”出版的《面向对象技术与visual c++6.0教程》上得来的 我的理解是“因为友员函数可以任意调用定义友员函数的类内的成员函数和数据成员,所以通过distance(p1,p2) 吧对象p1p2分别传递给函数体(这和只有一个含对象的参量的差别就是少了一个对象参量”)这个理解并没有错误要不然程序2就不会运行成功
  当然可以不这样处理,可以直接在构造函数中定义两个点,即四个参量 但是要是点多了这样处理就不好了 所以“我想之定义一个“点类”然后其它的类或者函数可以任意调用其中的点”这才是我这个程序的主要目的。
2008-7-24 12:16
zhonglai123
Rank: 1
等级:新手上路
帖子:13
积分:244
注册:2008-7-23
回复 4# lindayanglong 的帖子

这个程序不管用 编译可以但是连接就出错 这太机器上没有这个软件所以没办法给你写出具体错误
我看好像是在内存地址上的错
2008-7-24 12:35
zhonglai123
Rank: 1
等级:新手上路
帖子:13
积分:244
注册:2008-7-23
回复 5# lindayanglong 的帖子

你的编译有错误吗
2008-7-24 12:35
lindayanglong
Rank: 2
等级:注册会员
帖子:83
积分:1036
注册:2008-3-9

编译有错误 很奇怪 我看不出哪里错了
Compiling...
luntan5.cpp
E:\vc++实验\luntan5\luntan5.cpp(19) : error C2061: syntax error : identifier 'Ineternet'
E:\vc++实验\luntan5\luntan5.cpp(21) : error C2248: 'name' : cannot access private member declared in class 'Internet'
        E:\vc++实验\luntan5\luntan5.cpp(14) : see declaration of 'name'
E:\vc++实验\luntan5\luntan5.cpp(21) : error C2065: 'obk' : undeclared identifier
E:\vc++实验\luntan5\luntan5.cpp(21) : error C2228: left of '.address' must have class/struct/union type
Error executing cl.exe.
2008-7-24 13:39
病书生
Rank: 2
等级:注册会员
帖子:93
积分:1150
注册:2007-11-8

测试通过

#include <iostream>
using namespace std;
class Internet
{
public:
Internet(char *name,char *address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
friend void ShowN(Internet obj,Internet obk);//友元函数的声明
public:
char name[20];
char address[20];
};


void ShowN(Internet obj,Internet obk)//函数定义,不能写成,void Internet::ShowN(Internet &obj)
{
cout<<obj.name<<obk.address<<endl;
}
void main()
{
Internet a("中国软件开发实验室","www.cndev-lab.com");
Internet b("中国软件开发实验室","www.cndev-lab.com");
ShowN(a,b);
}

[ 本帖最后由 病书生 于 2008-7-24 16:41 编辑 ]
2008-7-24 16:35
共有 688 人关注过本帖
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.053664 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved