标题:C++友元函数的问题
只看楼主
guxing88
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-9-29
结帖率:0
已结贴  问题点数:5 回复次数:2 
C++友元函数的问题
这个程序是定义一个描述“点”的类,然后通过调用“点”类来定义一个描述“直线”的类。最后返回“直线”类的长度。使用的工具是visual studio 2010。代码如下。
/stdafx.h
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <string>
#include <iostream>
using namespace std;
class cpoint
{
public:
    cpoint(double X,double Y){x=X;y=Y;};
    cpoint(cpoint& p);
    friend  cline::cline(cpoint& p1,cpoint& p2);
    ~cpoint(void);
private:
    double x;
    double y;
};
class cline
{
public:
    cline(cpoint& p1,cpoint& p2);
    ~cline(void);
    double getlength();
private:
    cpoint cstart,cend;
    double length;
};


/youyuan.cpp
#include "stdafx.h"
cpoint::cpoint(cpoint& p)
{
    x=p.x;
    y=p.y;
}
cline::cline(cpoint& p1,cpoint& p2):cstart(p1),cend(p2)
{
    double xx,yy;
    xx=fabs(p1.x-p2.x);
    yy=fabs(p1.y-p2.y);
    length=sqrt(xx+yy);
}
cline::~cline(void)
{
}
double cline::getlength()
{
    return this->length;
}
int _tmain(int argc, _TCHAR* argv[])
{
    cpoint p1(2,6),p2(3,7);
    cline myline(p1,p2);
    cout<<"the length of myline is:"<<myline.getlength()<<endl;
    getchar();
    return 0;
}
这时代码标红的地方会提示“成员cpoint::x不可访问”或“成员cpoint::y不可访问”。

———————————————————————————————————————————————————————————————
/stdafx.h
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <string>
#include <iostream>
using namespace std;
class cpoint;
class cline
{
public:
    cline(cpoint& p1,cpoint& p2);
    ~cline(void);
    double getlength();
private:
    cpoint cstart,cend;
    double length;
};
class cpoint
{
public:
    cpoint(double X,double Y){x=X;y=Y;};
    cpoint(cpoint& p);
    friend  cline::cline(cpoint& p1,cpoint& p2);
    ~cpoint(void);
private:
    double x;
    double y;
};



/youyuan.cpp
#include "stdafx.h"
cpoint::cpoint(cpoint& p)
{
    x=p.x;
    y=p.y;
}
cline::cline(cpoint& p1,cpoint& p2):cstart(p1),cend(p2)
{
    double xx,yy;
    xx=fabs(p1.x-p2.x);
    yy=fabs(p1.y-p2.y);
    length=sqrt(xx+yy);
}
cline::~cline(void)
{
}
double cline::getlength()
{
    return this->length;
}
int _tmain(int argc, _TCHAR* argv[])
{
    cpoint p1(2,6),p2(3,7);
    cline myline(p1,p2);
    cout<<"the length of myline is:"<<myline.getlength()<<endl;
    getchar();
    return 0;
}
将cline类的定义放在cpoint前边,则不会出现这个语法错误的提示。但是编译过程中,上边标红的位置会提示错误。错误提示如下“‘cline::cstart’使用未定义的 class‘cpoint’”,“‘cline::cend’使用未定义的 class‘cpoint’”。


请问一下,为什么cline和cpoint类的定义先后会赢下友元函数对私有类的访问,还有上述错误怎么解决。另外还有,如果想模块化编程,就是cline.h、cpoint.h、cline.cpp、cpoint.cpp里分别放各个类的声明和函数实体,在youyuan.cpp中实现主函数,各文件中应该包含哪些头文件。
搜索更多相关主题的帖子: public include private double 
2012-09-29 14:30
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:5 
前向引用     这个问题牵涉到对象的实体化

在类的数据成员中声明类的指针类型
---------------------------------------
2012-10-01 21:40
小小小火柴
Rank: 5Rank: 5
来 自:江西赣州
等 级:职业侠客
威 望:3
帖 子:141
专家分:337
注 册:2012-9-28
得分:0 
  这个只要写类的组合就可以实现吧?为什么一定要定义为友元函数呢?你说的将cline类的定义放在cpoint前边,则不会出现这个语法错误的提示。那是因为没有使用前向引用说明。

   好好学习!
2012-10-16 21:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-382321-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.096942 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved