为什么我在VC6下不能把在头文件中的一个类中声明的友元函数,在其他文件中定义,老是不能访问类中的私有变量,就好像不是友元函数一样,比如:
//头文件 complex.h
#include <iostream>
using namespace std;
class Complex
{
private:
double real;
double imaginary;
public:
Complex(){real=imaginary=0;}
Complex(double rl,double im){real=rl;imaginary=im;};
friend istream & operator>>(istream & os,Complex & plex);
};//函数定义文件
#include "complex.h"istream & operator>>(istream & os,Complex & plex)
{
cout<<"real:";
os>>plex.real;
cout<<"imaginary:";
os>>plex.imaginary;
return os;
}这个友元函数,就是无法成功编译,但把它作为内联函数直接放到头文件中定义,却可以编译,我不太懂VC6的集成环境,不知哪里出了问题?

解决方案 »

  1.   

    //头文件 complex.h
    #include <iostream>
    using namespace std;
    // 添加下面这一句试试
    istream & operator>>(istream & os,Complex & plex);class Complex
    {
    private:
    double real;
    double imaginary;
    public:
    Complex(){real=imaginary=0;}
    Complex(double rl,double im){real=rl;imaginary=im;};
    friend istream & operator>>(istream & os,Complex & plex);
    };//函数定义文件
    #include "complex.h"istream & operator>>(istream & os,Complex & plex)
    {
    cout<<"real:";
    os>>plex.real;
    cout<<"imaginary:";
    os>>plex.imaginary;
    return os;
    }
      

  2.   

    istream & operator>>(istream & os,Complex & plex);
    这个函数的声明一定得让它对于类 Complex 可见.不然就无法编译, 这是肯定的.
      

  3.   

    咦?我在类中声明,就是让类知道有这么个友元函数,
    class Complex
    {
    private:
    double real;
    double imaginary;
    public:
    Complex(){real=imaginary=0;}
    Complex(double rl,double im){real=rl;imaginary=im;};
    friend istream & operator>>(istream & os,Complex & plex); //就是它
    };如果还要在类上声明一次,那为何我把类中的友元函数声明直接该成内联函数,就可以了呢?,如:
    class Complex
    {
    private:
    double real;
    double imaginary;
    public:
    Complex(){real=imaginary=0;}
    Complex(double rl,double im){real=rl;imaginary=im;};
    friend istream & operator>>(istream & os,Complex & plex)
    {
    cout<<"real:";
    os>>plex.real;
    cout<<"imaginary:";
    os>>plex.imaginary;
    return os;
    }; //为什么这样是可以的?
    };
      

  4.   

    声明和定义连在一块当然可以了.你写自己的库时, 所有源码是自己的, 你可以不写任何头文件但你就得这样包含了#include "filename.cpp"你认为这样做好吗?缺点:
    1. 浏览函数定义不方便, 因为源码太长, 不能一页看上好几个函数定义
    2. 你无法将你的库发布而又不公开源码
    3. 每次编译都得把未修改的 cpp 文件再次编译
    .............