第二类没有成员v错误

时间:2011-04-03 21:59:02

标签: c++

我是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'的成员

有什么建议吗?谢谢。

3 个答案:

答案 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,反之亦然。

希望这有帮助,

杰森