为了账号安全,请及时绑定邮箱和手机立即绑定

友元成员函数写在一个cpp下时申明出错

求教高手,我把老师的几个类都写在demo.cpp下面,出问题了

#include <iostream>
using namespace std;

class Time{
	friend void printTime1(Time &t);
	friend void Match::printTime2(Time &t);
public:
	Time(int h,int m,int s){
		Hour=h;
		Minute=m;
		Second=s;
	}
private:
	int Hour;
	int Minute;
	int Second;
};

void printTime1(Time &t){
	cout<<t.Hour<<":"<<t.Minute<<":"<<t.Second<<endl;
}

class Match{
public:
	void printTime2(Time &t){
		cout<<t.Hour<<":"<<t.Minute<<":"<<t.Second<<endl;
	}
};




int main(){
	Time t(3,9,11);
	printTime1(t);
	Match m;
	m.printTime2(t);
}

编译说:‘Match’ has not been declared

我在前面加上

class Match;

编译又说:invalid use of incomplete type ‘class Match’

求教,写在一个cpp下应该怎么申明?

正在回答

3 回答

#include <iostream>
using namespace std;

class Time;          //声明Time类
class Match{         //Match类放在Time前面定义
public:
     void printTime2(Time &t);//声明成员函数,在类外定义
};

class Time{
    //friend void printTime1(Time &t);
    friend void Match::printTime2(Time &t);//友元成员函数
public:
    Time(int h,int m,int s){
        Hour=h;
        Minute=m;
        Second=s;
    }
private:
    int Hour;
    int Minute;
    int Second;
};

void Match::printTime2(Time &t)          
{
	cout<<t.Hour<<":"<<t.Minute<<":"<<t.Secondendl;
}
  
/*void printTime1(Time &t){
    cout<<t.Hour<<":"<<t.Minute<<":"<<t.Second<<endl;
} */
 
int main(){
    Time t(3,9,11);
    Match m;
    m.printTime2(t);
    return 0;
}


2 回复 有任何疑惑可以回复我~
#1

xiele 提问者

似乎懂了 ,非常感谢!
2017-03-15 回复 有任何疑惑可以回复我~
#2

BasicPlusPlus

谢谢,看一遍就懂了。要预先定义,然后在声明时使用定义。类似.h的作用。应该是C++本身语法问题。
2020-08-24 回复 有任何疑惑可以回复我~

在Match.cpp中加一条代码

#include "Time.h"


0 回复 有任何疑惑可以回复我~
#include <iostream>
using namespace std;
 
class Time{
    friend void printTime1(Time &t);
    friend void printTime2(Time &t);
public:
    Time(int h,int m,int s){
        Hour=h;
        Minute=m;
        Second=s;
    }
private:
    int Hour;
    int Minute;
    int Second;
};
 
void printTime1(Time &t){
    cout<<t.Hour<<":"<<t.Minute<<":"<<t.Second<<endl;
}
 
class Match{
public:       //如果改成private就访问不了了
    void printTime2(Time &t){
//        cout<<t.Hour<<":"<<t.Minute<<":"<<t.Second<<endl;
		cout<<"printTime2"<<endl;
    }
};
 
int main(){
    Time t(3,9,11);
    printTime1(t);
    Match m;
    m.printTime2(t);
	return 0;
}


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之模板篇
  • 参与学习       91156    人
  • 解答问题       318    个

本C++教程力求即学即会,所有知识以实践方式讲解到操作层面

进入课程

友元成员函数写在一个cpp下时申明出错

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信