鍍金池/ 問答/C++  網(wǎng)絡安全/ VS2017上C++友元成員函數(shù)問題

VS2017上C++友元成員函數(shù)問題


class Time
{
public:
    Time(int, int, int);
    ~Time();
    void displayTime(Date&);  // 錯誤C2061
private:
    int hour;
    int minute;
    int second;
};

class Date
{
public:
    Date(int, int, int);
    ~Date();
    friend void Time::displayTime(Date &); //錯誤C2245
private:
    int year;
    int month;
    int day;
};

錯誤信息:

錯誤 C2061 語法錯誤 : 標識符“Date”
錯誤 C2245 將不存在的成員函數(shù)“Time::displayTime”指定為友元(成員函數(shù)簽名與所有重載都不匹配)

請告訴這個類友元成員函數(shù)哪里出問題了?源代碼出自譚浩強的《C++程序設計》。謝謝

回答
編輯回答
敢試

我將源代碼進行了修改的 ,可以參考如下代碼 :

#include <iostream>
#include <cstdlib>

//前置聲明只能充當?shù)淖饔?: 
//1.定義一個指向該類型的指針和引用
//2.在不完全類型期間只能充當函數(shù)聲明的的參數(shù)類型
class Date;   

class Time   
{
public:
    Time(int h, int m, int s): hour(h) , minute(m) , second(s){}; 
    ~Time(){};
    void displayTime(Date&);  // 錯誤C2061    
private:
    int hour;
    int minute;
    int second;
   
};

class Date    
{
public:
    Date(int y, int m, int d): year(y) , month(m) , day(d){};
    ~Date(){}
    friend void Time::displayTime(Date &); //錯誤C2245
private:
    int year;
    int month;
    int day;
};


//最后定義clear函數(shù)
void Time::displayTime(Date& date){
    std::cout <<date.year<<std::endl;
}
 
int main(){
    Date date(1,2,3);
    Time time(4,5,6);
    time.displayTime(date);
    return EXIT_SUCCESS;
}

下圖是成員函數(shù)充當友元函數(shù)的操作順序 , 參考《C++ primer 第五版》 總結出的圖 :
注意 : 其中的 Window_mgr 等價 Time 類 , Screen類等價Date類
圖片描述

2018年6月30日 11:08
編輯回答
溫衫
class Date;

第一行缺少Date類聲明。

2017年6月28日 11:45