将一个类的成员函数作为另外一个类的友元函数,使用VS2015报错 10C
 #pragma once
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Screen {  

    friend void Window_mgr::clear(vector< Screen>::size_type);

public:
    typedef string::size_type pos;

    Screen() = default;
    Screen(pos ht, pos wd, char c) : cursor(0),
        height(ht), width(wd) { }
    char get()const
    {
        return contents[cursor];
    }
    inline char get(pos ht, pos wd)const;
    Screen &move(pos r, pos c);
    void some_memeber()const;
    Screen &set(char);
    Screen &set(pos, pos, char);
    Screen &display(ostream &os)
    {
        do_display(os);
        return *this;
    };
    const Screen &display(ostream &os)const
    {
        do_display(os);
        return *this;
    }
private:
    pos cursor = 0;
    pos height = 0, width = 0;
    string contents;
    mutable size_t access_ctr;
    void do_display(ostream &os)const { os << contents; }
};


inline Screen &Screen::move(pos r, pos c)
{
    pos row = r*width;
    cursor = row + c;
    return *this;

}

inline Screen &Screen::set(char c)
{
    contents[cursor] = c;
    return *this;


}
inline Screen &Screen::set(pos r, pos col, char ch)
{
    contents[r*width + col] = ch;
    return *this;
}


#pragma once
#include <iostream>
#include <vector>
#include <string>
#include "Screen.h"

class Screen;


using namespace std;

class Window_mgr
{

public:

    using ScreenIndex = vector< Screen>::size_type;
    void clear(ScreenIndex);


private:
    vector<Screen> screens{ Screen(20, 40, 'x') };

};


#include "Window_mgr.h"

class Screen;



void Window_mgr::clear(ScreenIndex i)
{

    Screen &s = screens[i];
    s.contents = string(s.height*s.width, ' ');
}

报错信息如下:
严重性 代码 说明 项目 文件 行
错误 C2248 “Screen::contents”: 无法访问 private 成员(在“Screen”类中声明) test0 c:\users\administrator\documents\visual studio 2015\projects\test0\test0\window_mgr.cpp 11
严重性 代码 说明 项目 文件 行
错误 C2248 “Screen::height”: 无法访问 private 成员(在“Screen”类中声明) test0 c:\users\administrator\documents\visual studio 2015\projects\test0\test0\window_mgr.cpp 11
严重性 代码 说明 项目 文件 行
错误 C2248 “Screen::width”: 无法访问 private 成员(在“Screen”类中声明) test0 c:\users\administrator\documents\visual studio 2015\projects\test0\test0\window_mgr.cpp 11
严重性 代码 说明 项目 文件 行
错误(活动) 后面有“::”的名称一定是类名或命名空间名 test0 c:\Users\Administrator\Documents\Visual Studio 2015\Projects\test0\test0\Screen.h 9
严重性 代码 说明 项目 文件 行
错误 C2027 使用了未定义类型“Window_mgr” test0 c:\users\administrator\documents\visual studio 2015\projects\test0\test0\screen.h 12

1个回答

我记得类的成员函数不能作为友元函数

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Python+OpenCV计算机视觉

Python+OpenCV计算机视觉

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的数据成员时显示错误 ![图片说明](https://img-ask.csdn.net/upload/201604/24/1461509513_125770.png) 然后调试的时候编译器就提示有下面的错误: > 错误 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 实验三 请问哪里不对呢,那两个类该怎么声明和引用啊?

link中是否能定义友元函数?友元函数是不是可以访问成员函数?

link中是否能定义友元函数?友元函数是不是可以访问成员函数?

类的友元函数是命名空间的成员吗?

在一个名称空间里面声明了一个类,在名称空间外定义,在这个类里面声明了一个友元函数,那么这个友元函数是不是原来名称空间的成员? 因为我实现这个友元的时候没有加命名空间限定,它自己认为自己是名称空间里的成员。 另外(与上无关),类的友元函数是不用事先声明的吧,现在类写到这了,需要友元,我就声明个友元,然后在类后面实现它就好了,是这样吗?或者我也可以事先声明,在类前声明,在类里加friend,类后再实现也是可以的是吗?

c++中给两个不同的类声明同一个友元函数

一名c++初学者,课本上一道关于友元函数的练习题让我不明白。 题目:定义Boat与Cat两个类,二者都有weight属性,定义二者的友元函数getTol(),计算二者的重量和。 我第一次写的代码是下面这样的,但是显示Car类的私有数据weight无法访问,编译也通过不了 ![图片说明](https://img-ask.csdn.net/upload/201708/07/1502096679_345929.jpg) 之后将getTol()函数的形参去掉,发现没有任何问题了,编译也可以通过,如下图是: ![图片说明](https://img-ask.csdn.net/upload/201708/07/1502096820_585738.jpg) (我用的编译器是VS2015) 哪位大咖帮我解释一下这两者的区别或者给我建议一个好的方案。 这里多谢啦。

C++的成员函数友元的问题

假如我声明了两个类,第二个声明的类中的成员函数作为第一个类的友元函数,这时候出现的编译错误该怎么解决

C++的简单问题:友元函数,友元类函数

练习3. 友元函数 定义一个应试人员类interviewee,具有私有属性:姓名、年龄、应聘职位。相关属性由带参构造函数进行初始化; (1)定义其友元函数showinfo将该类对象的相关信息进行输出。 (2)定义其友元类inerviewer,具有成员函数showinfo,用于将interviewee的对象信息进行输出。 (3)在主函数中创建interviewee对象并初始化,使用友元函数和友元类成员函数对interviewee对象信息进行输出 我的代码是这样的 #include"iostream" #include"string" using namespace std; class interviewee { friend class interviewer; public: interviewee(string ming1,int age1,string job1) { ming=ming1;age=age1;job=job1; } friend showinfo(interviewee a) { cout<<a.ming<<"\t"<<a.age<<"\t"<<a.job<<endl; } private: string ming,job; int age; }; class interviewer { public: void showinfo() { cout<<vi.ming<<" "<<vi.age<<" "<<vi.job; } private: interviewee vi; }; void main() { interviewee iv1("李依依",20,"路测工程师"); showinfo(iv1) ;interviewer.showinfo(); } 请问应该怎么改?

类的友元成员函数定义的位置

#include<iostream> using namespace std; class student; class date { public: int dat; date(int y=0) {dat=y;} void display(student &stu) {cout<<stu.test<<endl;}; }; class student { public: int test; student(int x=0){test=x;} friend void date::display(student & stu); }; //void date::display(student &stu){cout<<stu.test<<endl;}; int main() { student stu1(9); date dat(8); dat.display(stu1); return 0; } 编译错误信息 [Error] invalid use of incomplete type 'class student' [Error] forward declaration of 'class student' 为什么会编译错误?

c++用成员函数和友元函数实现复数的加减操作,产生了二义性,麻烦各位大哥大姐解答一下,感激不尽

我想在一个程序中用友元函数和类的成员函数实现复数的加减操作, 类中这样定义: ![图片说明](https://img-ask.csdn.net/upload/201511/29/1448777570_427657.png) main函数中用这几句调用的话存在二义性: ![图片说明](https://img-ask.csdn.net/upload/201511/29/1448777656_961072.png) c3=c1+c2;这一句就不知道到底该调用成员函数还是调用友元函数,但是重载的话只有参数类型和参数个数不同,就应该没问题的,这里该怎么解决呢? 麻烦各位大哥大姐了;下面是程序的代码, #include<iostream.h> class Complex { public: Complex(double r=0.0,double i=0.0):real(r),imag(i){} Complex operator+ (const Complex &c2)const; Complex operator- (const Complex &c2)const; friend Complex operator+(const Complex &c1,const Complex &c2); friend Complex operator-(const Complex &c1,const Complex &c2); friend ostream &operator<< (ostream &out,const Complex &c); void display()const; private: double real; double imag; } ; Complex Complex::operator+ (const Complex &c2)const { return Complex(real+c2.real,imag+c2.imag); } Complex Complex::operator- (const Complex &c2)const { return Complex(real-c2.real,imag-c2.imag); } void Complex::display()const { cout<<"("<<real<<","<<imag<<")"<<endl; } Complex operator+(const Complex &c1,const Complex &c2) { return Complex(c1.real+c2.real,c1.imag+c2.imag); } Complex operator-(const Complex &c1,const Complex &c2) { return Complex(c1.real-c2.real,c1.imag-c2.imag); } ostream &operator<< (ostream &out,const Complex &c) { out<<"("<<c.real<<","<<c.imag<<")"<<endl; return out; } int main() { Complex c1(5,4),c2(2,10),c3; c1.display(); c2.display(); c3.display(); c3=c1+c2; c3.display(); cout<<c3; c3=c3-c1; c3.display(); cout<<c3; return 0; }

C++UML图怎么表示一个类是另外一个类的友元类

C++UML图怎么表示一个类是另外一个类的友元类,求大神帮助

一个关于友元函数的问题

#include<iostream> using namespace std; class Car { int size; public: void getsize(int j) { size = j; } friend int leisure(int time,const Car& aobj,const Boat& bobj); }; class Boat { int size; public: void setsize(int j) { size = j; } friend int leisure(int time, const Car& aobj, const Boat& bobj); }; int leisure(int time, const Car& aobj, const Boat& bobj) { int t = time*bobj.size; return t; } int main() { Car c; c.getsize(2); Boat b; b.setsize(3); cout << leisure(5, c, b); } c:\school learning\vshomework\consoleapplication2\consoleapplication2\源.cpp(8): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>c:\school learning\vshomework\consoleapplication2\consoleapplication2\源.cpp(8): error C2143: 语法错误: 缺少“,”(在“&”的前面)

友元函数无法通过编译

#include <iostream> using namespace std; #include <math.h> class Point//Point类声明 { public://外部接口 Point(int xx=0, int yy=0) {x=xx;y=yy;} int getX() {return x;} int getY() {return y;} friend double distance(Point &a, Point &b); private://私有数据成员 int x,y; }; double distance( Point& a, Point& b) { double dx=a.x-b.x; double dy=a.y-b.y; return sqrt(dx*dx+dy*dy); } int main() { Point p1(3.0, 5.0), p2(4.0, 6.0); double d=distance(p1, p2); cout<<"The distance is "<<d<<endl; return 0; } **这个在devC++中无法通过编译,问题出在那个distance友元函数那里; 如果我不用友元函数,就直接用一个成员函数就可以通过编译,球球哪位大佬看一下呗!**

用友元类外函数调用类的私有成员,显示无法调用,是什么原因

#include <iostream> #include <stdlib.h> using namespace std; class Date; class Time { private: int hour; int minute; int sec; public: Time(int h, int m, int s) :hour(h), minute(m), sec(s){} friend void display(Time & , Date & ); }; class Date { private: int month; int day; int year; public: Date(int h, int m, int s) :month(h), day(m), year(s){} friend void display(Time &, Date &); }; void dispaly(Time & t, Date & d) { cout << d.month << "/" << d.day << "/" << d.year << endl; cout << t.hour << ":" << t.minute << ":" << t.sec << endl; } void main() { Time t1(12, 13, 14); Date d1(6, 12, 2016); dispaly(t1, d1); system("pause"); }

类的友元函数不能引用类对象的数据成员

做教材后的一道课后题,getTotalWeight函数返回两个类对象private类型的weight属性,求和后并返回。头文件编好后语法检查通不过。函数可以引用Car对象的属性但是不能引用Boat对象的属性。检查了好久了不知道错误在哪。小弟刚接触C++,麻烦赐教谢谢! ![图片说明](https://img-ask.csdn.net/upload/202001/01/1577875917_489301.jpg)

C++继承含有友元函数的基类后,子类对象模型问题

template<typename T> class less{ friend bool operator==<T>(const T& l, const T& r); public: less() {} ~less() {} }; class point : less<point> { friend bool operator< (const point& l, const point& r); point () {} ~point() {} private: int x; }; void main() { point one(5); point two(6); cout << (one < two) << endl; cout << (one == two) << endl; cin.get(); } 手动定义了< 操作符,而继承了一个定义了 == 的友元模板函数的模板类(为了简洁点,函数定义我这里没给出)。 求教各位大神,为什么在 one == two 执行时,编译器会找到 less 类的 == 函数中去,子类point中定义了一个friend < 操作符函数,而 less中定了一个 == 的模板函数,继承的是point的一个实例。 简化一下我的问题,我想透彻了解一下编译器调用函数的行为,如何通过子类point对象找到基类中 == 操作符函数的。 也可以给我推荐一下关于这方面的书籍,深入友元内部实现的。

c++类的友元函数可以访问该类的内嵌类么?

如题。 好像我编译通过不了,内嵌类是私有成员。 好吧随便打几个字凑足30字

c++友元函数形参的问题

友元类函数的定义是 friend double dist(Point &p1,Point &p2); 但是 把&去掉 friend double dist(Point p1,Point p2); 不会提示错误 反而调用了复制构造函数是为什么? #include<iostream> #include<cmath> using namespace std; class Point { public: Point (int x=0,int y=0):x(x),y(y) { cout<<"构造函数被调用"<<endl; } Point (Point &p) { cout<<"复制构造函数被调用"<<endl; x=p.x; y=p.y; } friend double dist(Point &p1,Point &p2); private: int x,y; }; double dist(Point &p1,Point &p2) { double x=p2.x-p1.x; double y=p2.y-p1.y; return sqrt(x*x+y*y); } int main() { Point mp1(1,1),mp2(4,5); cout<<"len="; cout<<dist(mp1,mp2)<<endl; return 0; }

关于C++的友元函数实现在类的外部问题?

``` #include<iostream> using namespace std; template<typename T> class Complex { friend ostream & operator<< <T> (ostream &out,Complex &tmp); private: T a; T b; public: Complex(T a, T b); void printR(); Complex operator+(Complex &c); }; int main() { Complex<int> a(10,10); Complex<int> b(10,20); Complex<int> c = a+b; c.printR(); return 0; } template<typename T> ostream & operator<<(ostream &out,Complex<T> &tmp) { out<< "a = " << tmp.a <<" b = " << tmp.b << endl; return out; } template<typename T> Complex<T>::Complex(T a, T b) //Complex 类的构造函数。 { this-> a = a; this-> b = b; } template<typename T> void Complex<T>::printR() //Complex 类的普通函数. { cout << "a = " << a <<" b = " << b << endl; } template<typename T> Complex<T> Complex<T>::operator+(Complex<T> &c) { Complex<T> tmp(c.a+a,c.b+b); return tmp; } ``` 同样的程序在VS里面可以,但codeblocks里面却不行,应该怎么改呢?

C++:类构造函数可以友元吗?

``` class Box { public: friend Box(); }; ``` 请问这样可以吗? 可以的话,怎么操作呢? 求解!

c++友元类初始化数据要用到另外两个类的私有数据

最近在写代码,碰到一个问题,就是我定义的一个类,这个类的初始数据想要用到另外两个类的私有数据,但是提示inaccessible,已经在另外两个类中规定了本类为友元类。详情见图,tPoint就是我定义的一个类,task1和p1是另外两个类的对象。还有一个问题,友元类是只能让成员函数去访问其他类的数据?不能够让其他类的数据相加减作为本类的初始数据?![![![图片说明](https://img-ask.csdn.net/upload/201703/06/1488788644_805797.png)图片说明](https://img-ask.csdn.net/upload/201703/06/1488788626_302830.png)图片说明](https://img-ask.csdn.net/upload/201703/06/1488788617_37142.png)

2019 Python开发者日-培训

2019 Python开发者日-培训

150讲轻松搞定Python网络爬虫

150讲轻松搞定Python网络爬虫

设计模式(JAVA语言实现)--20种设计模式附带源码

设计模式(JAVA语言实现)--20种设计模式附带源码

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

java后台+微信小程序 实现完整的点餐系统

java后台+微信小程序 实现完整的点餐系统

三个项目玩转深度学习(附1G源码)

三个项目玩转深度学习(附1G源码)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

2019 AI开发者大会

2019 AI开发者大会

玩转Linux:常用命令实例指南

玩转Linux:常用命令实例指南

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

4小时玩转微信小程序——基础入门与微信支付实战

4小时玩转微信小程序——基础入门与微信支付实战

Git 实用技巧

Git 实用技巧

Python数据清洗实战入门

Python数据清洗实战入门

使用TensorFlow+keras快速构建图像分类模型

使用TensorFlow+keras快速构建图像分类模型

实用主义学Python(小白也容易上手的Python实用案例)

实用主义学Python(小白也容易上手的Python实用案例)

程序员的算法通关课:知己知彼(第一季)

程序员的算法通关课:知己知彼(第一季)

MySQL数据库从入门到实战应用

MySQL数据库从入门到实战应用

机器学习初学者必会的案例精讲

机器学习初学者必会的案例精讲

手把手实现Java图书管理系统(附源码)

手把手实现Java图书管理系统(附源码)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

.net core快速开发框架

.net core快速开发框架

玩转Python-Python3基础入门

玩转Python-Python3基础入门

Python数据挖掘简易入门

Python数据挖掘简易入门

微信公众平台开发入门

微信公众平台开发入门

程序员的兼职技能课

程序员的兼职技能课

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

HoloLens2开发入门教程

HoloLens2开发入门教程

微信小程序开发实战

微信小程序开发实战

Java8零基础入门视频教程

Java8零基础入门视频教程

相关热词 c#跨线程停止timer c#批量写入sql数据库 c# 自动安装浏览器 c#语言基础考试题 c# 偏移量打印是什么 c# 绘制曲线图 c#框体中的退出函数 c# 按钮透明背景 c# idl 混编出错 c#在位置0处没有任何行
立即提问