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个回答

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

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

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

ifndef STUDENT.H #define STUDENT.H

end if加上这些

YXTS122
YXTS122 STUDENT_H
大约 4 年之前 回复

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

qq_29324197
别动_我的帽子 我还是去看书吧
大约 4 年之前 回复

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();
};

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

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

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

实际上应该先在student的类定义前加上class Score,要不然里面的函数使用的score类型就是非法的完了之后主程序要满足先载入友元函数原型所在的类,在载入调用友元函数的类的头文件。实际上他应该是这样子,要先把友元函数原型所在的类放在调用类的前面,要先读取了函数里面的内容再来调用,如果先调用再载入函数原型的话,他理解为了你直接调用保护变量,自然就提示没法访问了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
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 实验三 请问哪里不对呢,那两个类该怎么声明和引用啊?

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; }

将一个类的成员函数作为另外一个类的友元函数,使用VS2015报错

``` #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

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(); } 请问应该怎么改?

关于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里面却不行,应该怎么改呢?

一个关于友元函数的问题

#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: 语法错误: 缺少“,”(在“&”的前面)

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++友元函数形参的问题

友元类函数的定义是 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; class Y; class X { private: int i; public: X(){ i = 0; } friend void h(X*); friend void Y::g(X x); //friend class Y; friend class Z; }; class Y { public: void g(X*); }; void Y::g(X*x) { (x->i) += 1; } class Z { public: void f(X*); }; void Z::f(X*x) { x->i += 5; } void h(X* x) { x->i += 10; } int main() { X x; Y y; y.g(&x); /* X x; Z z; z.f(&x)*/; system("pause"); return 0; } 3 IntelliSense: 声明与 "void Y::g(X *x)" (已声明 所在行数:24) 不兼容 c:\Users\dell\Desktop\Project2\Project2\main.cpp 14 17 Project2 4 IntelliSense: 成员 "X::i" (已声明 所在行数:10) 不可访问 c:\Users\dell\Desktop\Project2\Project2\main.cpp 26 6 Project2 错误 2 error C2248: “X::i”: 无法访问 private 成员(在“X”类中声明) c:\users\dell\desktop\project2\project2\main.cpp 26 1 Project2 错误 1 error C2027: 使用了未定义类型“Y” c:\users\dell\desktop\project2\project2\main.cpp 14 1 Project2

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对象找到基类中 == 操作符函数的。 也可以给我推荐一下关于这方面的书籍,深入友元内部实现的。

关于友元函数的小问题

#include <iostream> //声明类Point using namespace std; class Point { public: Point(float x=0,float y=0); //有默认参数的构造函数 void setPoint(float ,float); //设置坐标值 float getX( )const {return x;} //读x坐标 float getY( )const {return y;} //读y坐标 friend ostream& operator<<(ostream &,const Point &); //重载运算符“<<” protected: //受保护成员 float x, y; }; //下面定义Point类的成员函数 Point::Point(float a,float b) //Point的构造函数 { //对x,y初始化 x=a; y=b; } void Point::setPoint(float a,float b) //设置x和y的坐标值 { //为x,y赋新值 x=a; y=b; } //重载运算符“<<”,使之能输出点的坐标 ostream& operator<<(ostream &cout, const Point &p) { cout<<"["<<p.x<<","<<p.y<<"]"<<endl; return cout; } class Circle:public Point //circle是Point类的公用派生类 { public: Circle(float x=0,float y=0,float r=0); //构造函数 void setRadius(float ); //设置半径值 float getRadius( )const; //读取半径值 float area ( )const; //计算圆面积 friend ostream &operator <<(ostream &,const Circle &); //重载运算符“<<” private: float radius; }; //定义构造函数,对圆心坐标和半径初始化 Circle::Circle(float a,float b,float r):Point(a,b),radius(r){} //设置半径值 void Circle::setRadius(float r){radius=r;} //读取半径值 float Circle::getRadius( )const {return radius;} //计算圆面积 float Circle::area( )const { return 3.14159*radius*radius; } //重载运算符“<<”,使之按规定的形式输出圆的信息 ostream &operator <<(ostream &output,const Circle &c) { output<<"Center=["<<c.x<<","<<c.y<<"],r="<<c.radius<<",area="<<c.area( )<<endl; return output; } int main( ) { Circle c(3.5,6.4,5.2); //建立Circle类对象c,并给定圆心坐标和半径 cout<<"original circle:\\nx="<<c.getX()<<", y="<<c.getY()<<", r="<<c.getRadius( )<<", area="<<c.area( )<<endl; //输出圆心坐标、半径和面积 c.setRadius(7.5); //设置半径值 c.setPoint(5,5); //设置圆心坐标值x,y cout<<"new circle:\\n"<<c; //用重载运算符“<<”输出圆对象的信息 Point &pRef=c; //pRef是Point类的引用变量,被c初始化 cout<<"pRef:"<<pRef; //输出pRef的信息 return 0; } 报错内容是(友元函数不能访问保护成员???) G:\c_files\try_2.cpp(506) : error C2248: 'x' : cannot access protected member declared in class 'Point' G:\c_files\try_2.cpp(490) : see declaration of 'x' G:\c_files\try_2.cpp(506) : error C2248: 'y' : cannot access protected member declared in class 'Point' G:\c_files\try_2.cpp(490) : see declaration of 'y' G:\c_files\try_2.cpp(534) : error C2248: 'x' : cannot access protected member declared in class 'Point' G:\c_files\try_2.cpp(490) : see declaration of 'x' G:\c_files\try_2.cpp(534) : error C2248: 'y' : cannot access protected member declared in class 'Point' G:\c_files\try_2.cpp(490) : see declaration of 'y' G:\c_files\try_2.cpp(534) : error C2248: 'radius' : cannot access private member declared in class 'Circle' G:\c_files\try_2.cpp(518) : see declaration of 'radius' G:\c_files\try_2.cpp(539) : warning C4305: 'argument' : truncation from 'const double' to 'float' G:\c_files\try_2.cpp(539) : warning C4305: 'argument' : truncation from 'const double' to 'float' G:\c_files\try_2.cpp(545) : error C2593: 'operator <<' is ambiguous 执行 cl.exe 时出错. 另有,将point类中重载函数写成inline就不报错了,为什么?

c++运算符重载问题,友元函数

#include<iostream> #include<string> using namespace std; class Complex { public: Complex(double newx=0.0, double newy=0.0 ); //Complex(); Complex(Complex &c); double getx() const; double gety() const; Complex Add(const Complex &another); void Output(); friend istream & operator>>(istream &in, const Complex &c); friend ostream & operator<<(ostream &out, const Complex &c); Complex operator+(const Complex &c2)const; ~Complex(){}; private: double x,y; }; Complex::Complex(double newx, double newy) { x=newx; y=newy; } /*Complex::Complex() { x=0; y=0; } */ Complex::Complex(Complex &c) { x=c.x; y=c.y; } double Complex::getx()const { return x; } double Complex::gety()const { return y; } Complex Complex::Add(const Complex &another) { Complex r; r.x=x+another.getx(); r.y=y+another.gety(); return r; } void Complex::Output() { cout<<x; if(y>=0) cout<<"+"; cout<<y<<"i"<<endl; } Complex Complex::operator+(const Complex &c2)const { return Complex(x+c2.x,y+c2.y); } istream & operator>>(istream &in, const Complex &c) { // in>>"(">>c.x>>","<<c.y<<")"; in>>c.x; in>>c.y; return in; } ostream & operator<<(ostream &out, const Complex &c) { out<<"("<<c.x<<","<<c.y<<")"; return out; } int main(int argc,char&agrv[]) { Complex z1(3,5),z2(4.5,2.3),z3(2,3); Complex z4; Complex z5(z1); z5.Output(); cin>>z1; cin>>z2; z4=z1.Add(z2); z4.Output(); z3 = z1+z2; z3.Output(); return 0; }

c++运算符重载为非成员函数问题

用vc6.0写复数类,使运算符重载为非成员函数,组建时出现fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'msc1.cpp', line 1794) Please choose the Technical Support command on the Visual C++ Help menu, or open the Technical Support help file for more information 这要怎么解决,网上的各种办法都试过了还是不行,我还重载了输入>>和输出<<两个符号

c++ 结构体中的成员函数怎么解决

结构体中的成员函数在成员函数的参数中不能看this的地址它说【表达式必须为左值或函数指示符】应该怎么才能看this的地址 不明白解释以下比如说 #include<iostream> using namespace std; struct MyStruct { int h; int i; void hun() { cout << h + i; } }; int main() { MyStruct ki; ki.h = 10; ki.i = 100; ki.hun(); } 不能查看this的地址

已经声明了友元函数为什么还是不能访问x的私有数据?还有这个头文件的引用方式是对的吗?

![图片说明](https://img-ask.csdn.net/upload/202004/03/1585880261_61339.png) ``` #include <iostream> #include "Classfile.h" using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ //C++ P186 5-13 int main(int argc, char** argv) { X x; Y y; Z z; x(5); y.g(x); z.f(x); return 0; } ``` ``` class X{ public: friend void g(X x); friend class Z; friend void h(X x); X(int i=0):i(i){} private: int i; }; class Y{ public: void g(X x); private: }; void Y::g(X x){ x.i=x.i+1; cout<<"i="<<x.i<endl; } class Z{ public: void f(X x); private: X x; }; void Z::f(X x) { x.i=x.i+5; cout<<"i="<<x.i<endl; } void h(X x) { x.i=x.i+10; cout<<"i="<<x.i<endl; } ```

C++程序方面的问题 希望大神解答一下感谢感谢

定义类X,Y,Z,函数h(X*),满足:类X有私有成员i,Y的成员函数g(X*)是X的友元函数,实现对X的成员i加1;类Z是类X的友元类,其成员函数f (X*)实现对X的的成员i加5;函数h(X*)是X的友元函数,实现对X的成员i加10 #include<iostream> using namespace std; class Y; class Z; class Y{ public: void g(X* pa); }; class X{ private: int i; public: X(){ i=0; } friend void Y::g(X* pa); friend class Z; friend void h(X* pa); }; class Z{ public: void f(X* pa){ pa->i += 5; } }; void Y::g(X* pa){ pa->i++; } void h(X* pa){ pa->i += 10; } 请问程序哪里有问题?

C++关于友元函数问题(VS2013编译环境提示错误)

这段代码用VS2013调试出来能够有黑窗口,且正常运行,但是VS2013总是提示错误,说是Date类的month,day , year不可访问,他们虽然声明为private,但是友元 函数不能访问Date类的私有成员吗? #include<iostream> using namespace std; class Date; class Time { public: Time(int, int, int); void display(Date &); private: int hour; int minute; int sec; }; class Date { public: Date(int,int,int); friend void Time::display(Date &); private: int month; int day; int year; }; Time::Time(int h, int m, int s) { hour = h; minute = m; sec = s; } void Time::display(Date &d) { cout << d.month << "/" << d.day << "/" << d.year << endl; cout << hour << ":" << minute << ":" << sec << endl; } Date::Date(int m, int d, int y) { month = m; day = d; year = y; } int main() { Time t1(10, 13, 56); Date d1(10,01,2011); t1.display(d1); return 0; }

定义类X、Y、Z,函数h(X *),满足:

定义类X、Y、Z,函数h(X *),满足:类X有私有成员i,Y的成员函数g(X *)是X的友元函数,实现对X的成员i加1;类Z是类X的友元类,其成员函数f(X *)实现对X的成员i加5;函数h(X  *)是X的友元函数,实现对X的成员i加10。在一个文件中定义和实现类,在另一个文件中实现main()函数。 代码我会写,可是如何实现“在一个文件中定义和实现类,在另一个文件中实现main()函数。”?麻烦说详细一点,谢谢!!! class Y{ public: void g(X *p); }; class X{ public: X(int _i); int display(){return i;} friend void Y::g(X *p); friend class Z; friend void h(X *p); private: int i; }; class Z{ public: void f(X *p){p->i+=5;} }; X::X(int _i){i=_i;} void Y::g(X *p){p->i++;} void h(X *p){p->i+=10;} void main(){ X x(5);Y y;Z z; cout<<"i="<<x.display()<<endl; y.g(&x); cout<<"i="<<x.display()<<endl; z.f(&x); cout<<"i="<<x.display()<<endl; h(&x); cout<<"i="<<x.display()<<endl; }

【C++】写在构造函数里的变量能够被同一个类中其他成员访问吗?为什么?

class rational { private: long denom,den; //denom为分子,den为分母 double a; public: rational(int n, int m) { denom=n; den=m; **a=(double)denom/(double)den;** //比如这里构造函数里的a能被其他成员函数访问吗?为什么? } int operator<(rational r) const; int operator<=(rational r) const; int operator==(rational r) const; int operator!=(rational r) const; void display(); }; int rational::operator<(rational r) const { **if(a<((double)r.denom/(double)r.den))** //这里是引用构造函数里的a return 1; else return 0; }

c++关于用一个类外函数调用两个不同对象问题

设计一个CShape基类,由CShape类派生出矩形类CRectangle。再由矩形类CRectangle派生出长方体类CCuboid,设计不属于这些类的Display函数,用来输出CRectangle和CCuboid对象的周长和面积。根据下面的测试程序设计这些类及函数Display。请自行补充所涉及的头文件。问题是如何用一个类外的函数调用来个不同类的对象。急,在线等

程序员的兼职技能课

程序员的兼职技能课

为linux系统设计一个简单的二级文件系统

实验目的: 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 实验要求: 为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条)

CCNA+HCNA+wireshark抓包综合网工技能提升套餐

本套餐包含思科路由交换CCNA,部分CCNP核心,华为HCNA以及wireshark抓包等类容,旨在培养具有综合能力的网络工程师。

董付国老师Python全栈学习优惠套餐

购买套餐的朋友可以关注微信公众号“Python小屋”,上传付款截图,然后领取董老师任意图书1本。

成年人用得到的6款资源网站!各个都是宝藏,绝对让你大饱眼福!

不管是学习还是工作,我们都需要一些资源帮助我们有效地解决实际问题。 很多人找资源只知道上百度,但是你们知道吗,有的资源是百度也搜索不出来的,那么今天小编就给大家介绍几款好用的资源网站,大家赶紧收入囊中吧! 1.网盘007 https://wangpan007.com/ 一款全能的资源搜索网站!只需要输入关键字,就能获得你想要的视频、音乐、压缩包等各种资源,网上...

矿车轴载荷计算方法的比较及选用

针对矿车轴的弯曲损坏,分析了固定式矿车车轴的受力,并对力叠加法以及当量负荷法2种计算方法进行了分析和比较,认为应采用当量负荷法进行车轴的设计计算。

Python数据清洗实战入门

Python数据清洗实战入门

C/C++跨平台研发从基础到高阶实战系列套餐

一 专题从基础的C语言核心到c++ 和stl完成基础强化; 二 再到数据结构,设计模式完成专业计算机技能强化; 三 通过跨平台网络编程,linux编程,qt界面编程,mfc编程,windows编程,c++与lua联合编程来完成应用强化 四 最后通过基于ffmpeg的音视频播放器,直播推流,屏幕录像,

Polar编码matlab程序

matlab实现的Polar codes源程序

2019全国大学生数学建模竞赛C题原版优秀论文

2019全国大学生数学建模竞赛C题原版优秀论文,PDF原版论文,不是图片合成的,是可编辑的文字版。共三篇。 C044.pdf C137.pdf C308.pdf

Linux常用命令大全(非常全!!!)

Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大。我将我了解到的命令列举一下,仅供大家参考: 系统信息 arch 显示机器的处理器架构 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 d...

Linux下聊天室实现(基于C)

在linux下的基于TCP/IP,采用socket通信的聊天室,实现进入聊天室,进行多人群聊,指定人进行私聊,群主管理员功能,颗进行禁言,提出群聊等操作。个人账号可修改昵称或者修改密码,还可进行找回密

一个较完整的Qt用户登录界面设计

一个较完整的Qt用户登录界面,稍微移植可用,用sqlite数据库存储用户名和密码,具有增加和删除用户的功能,开发环境为ubuntu16.04+Qt5.6.1,win7下程序也编译可用。贡献出来,共同学

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

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

【C语言】贪吃蛇游戏代码(Visual C++6.0实现)

本游戏代码参考《C语言项目开发全程实录(第二版)》第六章。代码已在Visual C++6.0环境下编译测试通过,可在VC++6.0编译器中导入工程编译运行查看效果,或者也可以直接运行Release或D

Android小项目——新闻APP(源码)

Android小项目——新闻APP(源码),一个很简单的可以练手的Android Demo Ps:下载之前可以先看一下这篇文章——https://blog.csdn.net/qq_34149526/a

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

Android音视频开发全套

Android平台音视频开发全套,涉及:FFmpeg软解码解码、Mediacodec硬解码编码、Openssl音频播放、OpenGL ES视频渲染、RTMP推流等核心重要知识点。

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

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

2019 Python开发者日-培训

2019 Python开发者日-培训

2019 AI开发者大会

2019 AI开发者大会

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

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

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

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

因为看了这些书,我大二就拿了华为Offer

四年了,四年,你知道大学这四年我怎么过的么?

Python可以这样学(第四季:数据分析与科学计算可视化)

Python可以这样学(第四季:数据分析与科学计算可视化)

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

YOLOv3目标检测实战系列课程

《YOLOv3目标检测实战系列课程》旨在帮助大家掌握YOLOv3目标检测的训练、原理、源码与网络模型改进方法。 本课程的YOLOv3使用原作darknet(c语言编写),在Ubuntu系统上做项目演示。 本系列课程包括三门课: (1)《YOLOv3目标检测实战:训练自己的数据集》 包括:安装darknet、给自己的数据集打标签、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类。 (2)《YOLOv3目标检测:原理与源码解析》讲解YOLOv1、YOLOv2、YOLOv3的原理、程序流程并解析各层的源码。 (3)《YOLOv3目标检测:网络模型改进方法》讲解YOLOv3的改进方法,包括改进1:不显示指定类别目标的方法 (增加功能) ;改进2:合并BN层到卷积层 (加快推理速度) ; 改进3:使用GIoU指标和损失函数 (提高检测精度) ;改进4:tiny YOLOv3 (简化网络模型)并介绍 AlexeyAB/darknet项目。

DirectX修复工具V4.0增强版

DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复

C++语言基础视频教程

C++语言基础视频教程

相关热词 c# 局部 截图 页面 c#实现简单的文件管理器 c# where c# 取文件夹路径 c# 对比 当天 c# fir 滤波器 c# 和站 队列 c# txt 去空格 c#移除其他类事件 c# 自动截屏
立即提问