1.环境:Win7 + codeBlock + gcc
2.问题:友元函数报错
--------------
G:\projects\friendFun2\A.h|11|error: 'B' has not been declared|
G:\projects\friendFun2\A.h||In member function 'void B::bPrint(A)':|
G:\projects\friendFun2\A.h|14|error: 'int A::m_A' is private|
G:\projects\friendFun2\B.cpp|17|error: within this context|
||=== Build finished: 3 errors, 0 warnings ===|
--------------
代码分为A.h,A.cpp,B.h,B.cpp,main.cpp
A.h
#ifndef A_H #define A_H #include "B.h" class A { public: A(int ); virtual ~A(); friend void B::bPrint(A aa); protected: private: int m_A; }; #endif // A_H
B.h
#ifndef B_H #define B_H #include "A.h" class B { public: B(); virtual ~B(); void bPrint(A aa); protected: private: }; #endif // B_H
B.cpp
#include "B.h" #include <iostream> using namespace std; B::B() { //ctor } B::~B() { //dtor } void B::bPrint(A aa) { cout << "in B :" << aa.m_A << endl; }
A.cpp没什么好说的。
但是如果和在一个main.cpp的话,就没有上面的问题
#include <iostream> using namespace std; class A; class B { public: void bPrint(A aa); }; class A { public: friend void B::bPrint(A aa); A(int a):m_A(a){}; private: int m_A; }; void B::bPrint(A aa) { cout << "in B :" << aa.m_A << endl; } int main() { B b; A a(6); b.bPrint(a); return 0; }
首先你需要了解不完整的类型的概念,要不然你根本不明白那个顺序的原理。
不完整的类型指的是那种声明了,但是缺少具体定义的类型。比如你最后一段代码第5行。
这时候重要的是,什么时候可以用不完整的类型,什么时候不可以用。
你最后一段代码第11行,这部分是声明,所有A是不完整的类型,所以无所谓。
18行,这里B必须是完整的类型,否则B的成员函数是访问不了的。
25-28行,这里的实现需要A是完整的类型,所以必须放在A的定义之后。
所以是这样的:
#ifndefA_H#defineA_H#include"B.h"classA{public:A(inta):m_A(a){};virtual~A(){};friendvoidB::bPrint(Aaa);protected:private:intm_A;};#endif//A_HA.h不用改,为了编译,直接补上了实现。 #ifndefB_H#defineB_HclassA;classB{public:B();virtual~B();voidbPrint(Aaa);protected:private:};#endif//B_H直接声明classA,而不是#include。 #include"B.h"#include"A.h"#include<iostream>usingnamespacestd;B::B(){//ctor}B::~B(){//dtor}voidB::bPrint(Aaa){cout<<"inB:"<<aa.m_A<<endl;}看Primer的时候发现这个问题。
然后百度到下面这个顺序:
先声明A->定义B类->定义A类->定义友元函数.
但A和B类不在一个文件时,就悲剧了。
C++大神帮忙看看
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。