在c ++中使用跨类的结构

时间:2015-03-22 13:51:58

标签: c++ class struct

我仍然是c ++的新手,所以请允许! 基本上我在头文件中为我的一个充满字符串的类创建了一个结构。

typedef struct details{
        string name;
        string address;
}details;

我希望不仅在属于标题的cpp文件中使用此结构,而且在其他类中也是如此。例如,我想在另一个头文件中创建此结构的向量。

private:
vector <details> foo;

我也想在主

中使用struct
details d;
d.name = "hi";
d.address = "hello";

然而,当我目前尝试这样做时,我会收到诸如

之类的错误
error: 'details' was not declared in this scope
     vector <details> foo;

error: template argument 1 is invalid
     vector <details> foo;

有没有人有类似的问题可以提供我可以做些什么来解决这个问题?非常感谢。

编辑演示代码

class1.h

#include "class2.h"

struct trans1{
    string name;
};
class class1 {

private:
    vector <trans2> t2;

public:
    class1();
};

class2.h

#include "class1.h"

struct trans2{
    string type;
};

class class2{

private:
    vector <trans1> t1;

public:
    class2();
};

错误日志:

In file included from class1.h:3:0,
                 from class1.cpp:1:
class2.h:21:13: error: 'trans1' was not declared in this scope
     vector <trans1> t1;
             ^
class2.h:21:19: error: template argument 1 is invalid
     vector <trans1> t1;
                   ^
class2.h:21:19: error: template argument 2 is invalid

我知道这在现实世界的应用程序中是荒谬的代码,但这是我演示的最简单方法

3 个答案:

答案 0 :(得分:2)

  

details.h

#include <string>

#ifndef DETAILS_H
#define DETAILS_H

struct details {
  std::string name;
  std::string address;
};

#endif
  

details.cpp

#include "details.h"
//insert implementation here
  

other_header.cpp

#include "details.h"
#include <vector>

std::vector<details> main_use;
//whatever else here

这应该有用。

修改

如果你想在另一个类中使用它:

  

my_class.h

#include "details.h"
#include <vector>

#ifndef MYCLASS_H
#define MYCLASS_H

class myClass {
std::vector<details> class_use;
//insert stuff here

};

#endif

编辑2

我很不确定为什么要像你一样在类中定义结构 - 这有点令人困惑。这是我如何做的。请注意#ifndef ... #define ... #endif模式非常重要。包含包含自身的标题也是一个坏主意。我会按照以下方式组织你的代码(就像你拥有它一样):

  

trans.h

#ifndef TRANS_H 
#define TRANS_H

#include <string>
struct trans1 {
   std::string name;
};

struct trans2 {
   std::string type;
};

#endif
  

class1.h

 #ifndef CLASS1_H
 #define CLASS1_H

 #include "trans.h"
 #include <vector>

 class Class1 {
   public:
     Class1();
   private:
     std::vector<trans2> t2;
 };

 #endif
  

class2.h

 #ifndef CLASS2_H
 #define CLASS2_H

 #include "trans.h"
 #include <vector>

 class Class2 {
   public:
     Class2();
   private:
     std::vector<trans1> t1;
 };

 #endif

现在它的组织方式,您可以在主要部分使用trans结构#include "trans.h",同时取消循环包含。希望这有帮助。

你会发现下面的main.cc现在编译没有错误。

  

main.cc

#include<iostream>
#include "class1.h"
#include "class2.h"
#include "trans.h"

int main()
{
    std::cout << "Hello, World!" << std::endl;

    return 0;

}

erip

答案 1 :(得分:1)

您必须在您使用的任何地方都包含包含struct定义的头文件。

您唯一不需要的情况是您只是声明引用或指向它;在这种情况下,你可以转发声明:

struct details;

同样在C ++中,你可以用:

声明它
struct details{
    std::string name;
    std::string address;
};

真的不需要typedef

答案 2 :(得分:0)

c ++中的结构定义类似于

 #include <string>

 struct details{
    std::string name;
    std::string address;
 };

并且必须在代码中的其他地方使用之前看到它。假设您将上面的声明放在头文件details.hpp中,您应该使用以下内容来使用它

 #include <vector>
 #include "details.hpp"

 // Some context

 std::vector<details> vdetails;

在某些情况下,当details结构成员未被实际访问时,您也可以使用前向声明

 struct details;

而不是包含完整的struct声明。然后可以使用此方法在进一步的声明中声明details*指针或details&引用,只要它们没有被解除引用它们。