C++ 在一个类中声明一个友元函数,为什么这个声明的友元函数名和类型不可见
#include<iostream>#include<vector>#include<string>usingstd::cin;usingstd::cout;usings...
#include <iostream>
#include <vector>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;
using std::istream;
using std::ostream;
class screen
{
public:
using pos = std::string::size_type;
screen() = default;
screen(const pos &a, const pos &b): hei(a), wid(b), con(a * b, ' ') {}
screen(const pos &a, const pos &b, const char &c): hei(a), wid(b), con(0, c) {}
friend void win::clear1(scr); //为什么这里的 WIN和SCR不可见 我已经在下面定义了啊 难道还要在 SCREEN类前面在声明一次吗?
char get()const
{
return con[cur];
}
char get(const pos &a, const pos &b )const;
screen &move1(const pos &a1, const pos &a2);
screen &set1(char);
screen &set1(pos, pos, char);
screen &display(ostream &os)
{
do_display(os);
return *this;
}
const screen &display(ostream &os)const
{
do_display(os);
return *this;
}
private:
void do_display(ostream &os)const
{
os << con;
}
pos cur = 0;
pos hei = 0, wid = 0;
string con;
};
class win
{
public:
using scr = std::vector<screen>::size_type;
void clear1(scr);
private:
vector<screen> screens{screen(24, 80, 'a')};
};
void win::clear1(scr i)
{
screen &s = screens[i];
s.con = string(s.hei * s.wid, ' ');
} 展开
#include <vector>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;
using std::istream;
using std::ostream;
class screen
{
public:
using pos = std::string::size_type;
screen() = default;
screen(const pos &a, const pos &b): hei(a), wid(b), con(a * b, ' ') {}
screen(const pos &a, const pos &b, const char &c): hei(a), wid(b), con(0, c) {}
friend void win::clear1(scr); //为什么这里的 WIN和SCR不可见 我已经在下面定义了啊 难道还要在 SCREEN类前面在声明一次吗?
char get()const
{
return con[cur];
}
char get(const pos &a, const pos &b )const;
screen &move1(const pos &a1, const pos &a2);
screen &set1(char);
screen &set1(pos, pos, char);
screen &display(ostream &os)
{
do_display(os);
return *this;
}
const screen &display(ostream &os)const
{
do_display(os);
return *this;
}
private:
void do_display(ostream &os)const
{
os << con;
}
pos cur = 0;
pos hei = 0, wid = 0;
string con;
};
class win
{
public:
using scr = std::vector<screen>::size_type;
void clear1(scr);
private:
vector<screen> screens{screen(24, 80, 'a')};
};
void win::clear1(scr i)
{
screen &s = screens[i];
s.con = string(s.hei * s.wid, ' ');
} 展开
1个回答
展开全部
友元的概念你弄混了。
友元的含义并不是取代前置声明,而是告诉一个类可以访问另一个类的内部私有成员(protected、private),是实际调用类方法、类属性时的一个权限问题。
而这里说找不到win、scr,是因为你的class win声明在screen后面,screen不知道有win的存在,你需要在class screen前面放前置声明class win;
友元的含义并不是取代前置声明,而是告诉一个类可以访问另一个类的内部私有成员(protected、private),是实际调用类方法、类属性时的一个权限问题。
而这里说找不到win、scr,是因为你的class win声明在screen后面,screen不知道有win的存在,你需要在class screen前面放前置声明class win;
追问
我在前面放置了class win, 但是friend void win::clear1(scr);这句里面的SCR依旧找不到 我加了win::scr还是报错
追答
clear1方法的参数类型scr,是在win类里声明的,screen并不知道,友元是解释权限的,与声明的解释无关;那么你就应该把这个scr声明也要前置。而win::scr是一种静态引用方法,在win类里,scr显然并非静态成员。这里涉及到类声明内部使用using语法,你这样用我感觉还是有点罕见,个人建议你可以把using scr = std::vector::size_type;这一行移到文件开头,而不是放在class win里面。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询