我是C ++的新手,我遇到了一个问题。我正在努力让班级成为共同的朋友,并从另一个人那里访问不同的成员。我无法弄清楚我做错了什么。这是到目前为止我所拥有的:
#ifndef HA_H_
#define HA_H_
#include"Ha2.h"
using namespace std;
class two;
class one{
public:
int tip;
int timp;
one(int t) :tip(t){}
friend class two;
};
#endif /* HA_H_ */
第二个标题:
#ifndef HA2_H_
#define HA2_H_
#include"Ha.h"
#include<vector>
class one;
class two{
public:
vector<one> v;
vector<int> x;
inline void create_x(vector<one> v){
// vector<one>::iterator it=v.begin();
int i;
for(i=0;i<v.size();i++){
x.push_back(v.at(i).tip);
}
}
friend class one;
};
#endif /* HA2_H_ */
主要:
#include<vector>
#include<iostream>
#include"Ha.h"
#include"Ha2.h"
int main()
{
one o(3);
two x;
x.v.push_back(o);
x.create_x(x.v);
cout<< x.x.back();
}
我得到了几个错误: 第二类没有名为'v'的成员
有什么建议吗?谢谢。
答案 0 :(得分:4)
main.cpp包含"Ha.h"
,using namespace std;
之前包含"Ha2.h"
。然后,定义class two
,将v
声明为vector<one>
,而vector
中没有限定std namespace
。
没有必要在“Ha.h”中包含“Ha2.h”,删除它,然后限定矢量。
答案 1 :(得分:4)
当类定义具有指针或引用时,将使用前向声明。并且这两个类定义都没有,所以前向声明是不必要的。
此外,标题还包含前向声明和相应的标题包含,这会使前向声明的整个目的无效。
在源文件中包含标题和using
指令。
截至目前,该程序没有方法来测试friend
的目的,所以这至少应该使程序编译。
Ha.h标题:
#ifndef HA_H_
#define HA_H_
class two ; // No pointers or references of two in one.
// So, remove it and place when you actually have
// a method taking reference of two.
class one{
public:
int tip;
int timp;
one(int t) :tip(t){}
friend class two;
};
#endif /* HA_H_ */
Ha.cpp
#include "Ha2.h" // Place this only when have a method accessing
// members of two. Else this is unnecessary.
#include "Ha.h"
using namespace std ;
Ha2.h
#ifndef HA2_H_
#define HA2_H_
class one ; // No pointers or references of one in two.
// So, remove it and place when you actually have
// a method taking reference of one.
class two{
public:
vector<one> v;
vector<int> x;
inline void create_x(vector<one> v)
{
// vector<one>::iterator it=v.begin();
int i;
for(i=0;i<v.size();i++)
{
x.push_back(v.at(i).tip);
}
}
friend class one;
};
#endif /* HA2_H_ */
Ha2.cpp
#include <vector>
#include "Ha.h" // Place this only when have a method accessing
// members of two. Else this is unnecessary.
#include "Ha2.h"
using namespace std ;
// .....
的main.cpp
#include <vector> // Definitely need this because in the current unit, Ha2.h is
// included which has a data type of vector<int>
#include <iostream>
#include"Ha.h"
#include"Ha2.h"
using namespace std ; // vector and the other standard definitions are specified
// in std namespace
int main()
{
one o(3);
two x;
x.v.push_back(o);
x.create_x(x.v);
cout<< x.x.back();
}
通过上述修改,您应该摆脱错误。如果弹出任何新错误,请在您的问题中发布确切的错误消息。
答案 2 :(得分:0)
删除循环依赖项的另一种方法是创建一个单独的头文件,如decl.h
或任何你想要的文件,在其中只需添加以下行:
#ifndef DECL_H_
#define DECL_H_
class one;
class two;
#endif DECL_H_
然后在Ha.h和Ha2.h中删除#include "Ha.h"
和#include "Ha2.h"
行并将其替换为#include "decl.h"
。同时删除Ha.h和Ha2.h中的class one;
和class two;
声明,但保留每个类的定义。
现在你不会有Ha.h取决于Ha2.h,反之亦然。
希望这有帮助,
杰森