2 baidu 33594185 baidu_33594185 于 2016.04.24 23:00 提问

C++使用类的成员函数作为友元函数

题目是:定义Student类和Score类,输出一个学生的成绩单(包括学号、姓名、高数、英语、政治、C++成绩)要求使用Student成员函数作为友元函数

我是这样写的(用的是VS2013):

Student.h

#pragma once
#include<string>
using namespace std;

class Student
{
public:
    Student(string num, string name)
    {
        this->num = num;
        this->name = name;
    }
    ~Student();
    void ShowData(Score &);
private:
    string num;
    string name;
};

Student.cpp

#include "stdafx.h"
#include "Student.h"
#include "Score.h"
#include <iostream>
using namespace std;

Student::~Student()
{
}

void Student::ShowData(Score &stu)
{
    cout << "=====学生信息=====\n";
    cout << "学号:\t" << num;
    cout << "\n姓名:\t" << name;
    cout << "\n高数:\t" << stu.Math;
    cout << "\n英语:\t" << stu.English;
    cout << "\n政治:\t" << stu.Politics;
    cout << "\nC++:\t" << stu.Cplusplus;
    cout << "\n===================\n";
}

Score.h

#pragma once
class Student;

class Score
{
public:
    Score(float Math, float English, float Politics, float  Cplusplus)
    {
        this->Math = Math;
        this->English = English;
        this->Politics = Politics;
        this->Cplusplus = Cplusplus;
    }
    ~Score();
    friend void Student::ShowData(Score &);
private:
    float Math;
    float English;
    float Politics;
    float Cplusplus;
};

Score.cpp

#include "stdafx.h"
#include "Score.h"

Score::~Score()
{
}

实验三.cpp

#include "stdafx.h"
#include "Score.h"
#include "Student.h"
#include <string>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    string num, name;
    float math, english, politics, cpluslus;
    cout<<"请输入学号,姓名以及数学,英语,政治和C++成绩:\n";
    cin >> num >> name >> math >> english >> politics >> cpluslus;
    Student stu(num,name);
    Score stu1(math,english,politics,cpluslus);
    stu.ShowData(stu1);
    return 0;
}

但是在Student.cpp文件中的ShowData函数中引用Score的数据成员时显示错误
图片说明

然后调试的时候编译器就提示有下面的错误:

错误 1 error C2027: 使用了未定义类型“Student” c:\users\xxxx\documents\visual studio 2013\projects\实验三\实验三\score.h 17 1 实验三

错误 2 error C2061: 语法错误: 标识符“Score” c:\users\xxxx\documents\visual studio 2013\projects\实验三\实验三\student.h 16 1 实验三

错误 3 error C2245: 将不存在的成员函数“Student::ShowData”指定为友元(成员函数签名与所有重载都不匹配) c:\users\xxxx\documents\visual studio 2013\proje
cts\实验三\实验三\score.h 17 1 实验三

错误 4 error C2511: “void Student::ShowData(Score &)”:“Student”中没有找到重载的成员函数 c:\users\xxxx\documents\visual studio 2013\projects\实验三\实验三\student.cpp 12 1 实验三

错误 5 error C2597: 对非静态成员“Student::num”的非法引用 c:\users\xxxx\documents\visual studio 2013\projects\实验三\实验三\student.cpp 14 1 实验三

错误 6 error C2597: 对非静态成员“Student::name”的非法引用 c:\users\xxxx\documents\visual studio 2013\projects\实验三\实验三\student.cpp 15 1 实验三

错误 7 error C2248: “Score::Math”: 无法访问 private 成员(在“Score”类中声明) c:\users\xxxx\documents\visual studio 2013\projects\实验三\实验三\student.cpp 16 1 实验三

错误 8 error C2248: “Score::English”: 无法访问 private 成员(在“Score”类中声明) c:\users\xxxx\documents\visual studio 2013\projects\实验三\实验三\student.cpp 17 1 实验三

错误 9 error C2248: “Score::Politics”: 无法访问 private 成员(在“Score”类中声明) c:\users\xxxx\documents\visual studio 2013\projects\实验三\实验三\student.cpp 18 1 实验三

错误 10 error C2248: “Score::Cplusplus”: 无法访问 private 成员(在“Score”类中声明) c:\users\xxxx\documents\visual studio 2013\projects\实验三\实验三\student.cpp 19 1 实验三

错误 11 error C2027: 使用了未定义类型“Student” c:\users\xxxx\documents\visual studio 2013\projects\实验三\实验三\score.h 17 1 实验三
12 IntelliSense: 不允许使用不完整的类型 c:\Users\xxxx\Documents\Visual Studio 2013\Projects\实验三\实验三\Score.h 17 14 实验三

请问哪里不对呢,那两个类该怎么声明和引用啊?

9个回答

qq423399099
qq423399099   Ds   Rxr 2016.04.25 14:00

楼上说的 对的,你的成员变量都是private的,不能直接通过对象.来访问,要么通过友元,要么声明成public,要么写成员函数(推荐)
比如访问Math可以写一个public的float GetMath()函数

c_zhi_hui
c_zhi_hui   2016.04.26 18:50

友元函数不能是另一个类中的成员函数。要是公共函数才能调用类中的私有变量。

CSDNXIAOD
CSDNXIAOD   2016.04.24 23:12

不使用成员函数或者友元函数访问类的私有成员变量
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

YXTS122
YXTS122   2016.04.24 23:24

ifndef STUDENT.H #define STUDENT.H

end if加上这些

YXTS122
YXTS122 STUDENT_H
大约 2 年之前 回复
YXTS122
YXTS122   2016.04.24 23:35

在student.h中加个类的前置声明
class Score;
class Student
{
……

qq_29324197
qq_29324197   2016.04.25 07:28

score里面的数据是private的 直接对象.数据 不能访问吧 改成public试一下

qq_29324197
qq_29324197 我还是去看书吧
大约 2 年之前 回复
c_zhi_hui
c_zhi_hui   2016.04.26 18:51

void ShowData(CScore &sc)
{
cout << sc.m_fCplusplus << "\t";
}

#pragma once
class CScore
{
float m_fMath;
float m_fEnglish;
float m_fPolitics;
float m_fCplusplus;
public:
CScore(float fMath, float fEnglish, float fPolitics, float fCplusplus);
friend void ShowData(CScore &sc);
~CScore();
};

c_zhi_hui
c_zhi_hui   2016.04.26 18:52

友元函数最好不要常用,这个破坏了类的结构。

xiaohuh421
xiaohuh421   Rxr 2016.06.23 09:10

当只使用了类的指针时, 才能以class xxxx 这样做声明, 然后在类中使用.

一但访问了类成功, 或者函数, 那么必须有类的完整实现.
而你这种程序就有这样的错误.

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
一个类的成员作为另一个类的友元函数
普通成员函数作为一个类的友元函数,以及一个类作为另一个类的友元类,都好
运算符重载函数作为类成员函数与友元函数的区别
运算符重载函数作为类成员函数与友元函数
C++中友元函数和成员函数的区别
什么是友元函数:     指某些虽然不是类的成员却能够访问类的所有成员的函数 为什么要使用:     为了使其他类的成员函数来访问该类的私有变量 什么时候使用:     可以用于运算符重载     两个类共享数据 调用方式:     不是类的成员函数,调用时不通过对象 存在位置:     可以在类内声明,类外定义,可放在类的私有段或公有段,放在私有段和公有段无区别。 什么
全局函数、类成员函数 作为友元函数
全局函数、类成员函数 作为友元函数 #include "stdafx.h" #include using namespace std; #if 0 同类对象间无私处 异类对象间有友员 //函数(可以是全局函数,也可是类成员函数)可以作友元,称为友元函数 //友元的位置在类中哪个位置都可以 可以在private也可以在public ----前向声明(forward declarati
将类的成员函数作为回调函数(外一篇:友元函数)
转自:http://blog.csdn.net/xylary/article/details/1548596 将类成员函数用做C回调函数 提出问题:  回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 分析原因: 普通的C+
关于类中的成员函数和非成员函数(即友元函数)的选择
在定义类的成员函数时,经常遇到运算符重载的情况,wang
友元(友元函数、友元类和友元成员函数) C++
有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的。例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。 友元(frend)机制允许一个类将对其非公有成员的访问权授予指定的函数或者类,友元的声明以frend开始,它只能出现在类定义的内部,友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所有它们不受其声明出现部分的访
C++运算符重载函数作为类成员函数和友元函数
例10.2中对运算符“+”进行了重载,使之能用于两个复数的相加。在该例中运算符重载函数operator+作为Complex类中的成员函数。 可能有的读者会提出这样的问题:”+“是双目运算符,为什么在例10.2程序中的重载函数中只有一个参数呢?实际上,运算符重载函数有两个参数,由于重载函数是Complex类中的成员函数,有一个参数是隐含的,运算符函数是用this指针隐式地访问类对象的成员。可以
C++之friend友元类和友元函数
将数据和处理数据的函数封装在一起,构成类,实现了数据的隐藏,无疑是面向对象程序设计的一大优点。但是有时候封装不是绝对的。 友元函数提供了不同类或对象的成员函数之间、类的成员函数和一般函数之间进行数据共享的机制。通俗的说,友元关系就是一个类主动声明哪些类或函数是它的朋友,进而给它们提供对本类的访问特性。也就是说,通过友元关系,一个普通函数或者类的成员函数可以访问封装于另外一个类中的数据。 从一定
类成员函数和类作为友元使用
 类成员函数可以作为友元在其他类中声明。考虑下面的例子: // classes_as_friends1.cpp// C2248 expectedclass B;class A...{    int Func1( B& b ) ;    int Func2( B& b ) ;};class B...{private:    int _b;    friend int A::Func1