我仍然是c ++的新手,所以请允许! 基本上我在头文件中为我的一个充满字符串的类创建了一个结构。
typedef struct details{
string name;
string address;
}details;
我希望不仅在属于标题的cpp文件中使用此结构,而且在其他类中也是如此。例如,我想在另一个头文件中创建此结构的向量。
private:
vector <details> foo;
我也想在主
中使用structdetails 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
我知道这在现实世界的应用程序中是荒谬的代码,但这是我演示的最简单方法
答案 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&
引用,只要它们没有被解除引用它们。