C++ C++;std::在头文件中初始化并设置向量
我目前在头文件中使用数组实现代码中的std::vectors时遇到了一些问题 我在StackOverflow和Google上搜索了过去一个半小时,没有找到任何有用的东西 简单地说,我一直在使用一个在头文件中初始化和设置的数组。使用C++ C++;std::在头文件中初始化并设置向量,c++,arrays,vector,header-files,C++,Arrays,Vector,Header Files,我目前在头文件中使用数组实现代码中的std::vectors时遇到了一些问题 我在StackOverflow和Google上搜索了过去一个半小时,没有找到任何有用的东西 简单地说,我一直在使用一个在头文件中初始化和设置的数组。使用std::vectors转换此代码会导致一些问题 我在(cern)根目录下进行项目分析,它使用了许多明显的typedef,例如Int\u t==>Int 其中一个导入的头文件使用名称空间std自动调用,因此我刚刚删除了所有的std::名称空间 目前我有: // file
std::vector
s转换此代码会导致一些问题
我在(cern)根目录下进行项目分析,它使用了许多明显的typedef
,例如Int\u t
==>Int
其中一个导入的头文件使用名称空间std自动调用
,因此我刚刚删除了所有的std::
名称空间
目前我有:
// file.h
// ...
const Int_t kNpdgCodes = 14;
Int_t pdgCodeID[kNpdgCodes] = {
0, // other
22, // photon
111, // pi0
-211, // pim
211, // pip
221, // eta
130, // K0L
310, // K0s
-321, // Km
321, // Kp
-2112, // (a)n
2112, // n
2212, // p
3122 // Lambda
};
// ...
我试图以以下形式获得它(或者更好,因为没有有用的=构造函数[不能使用C++11]):
对于与对应的每一行,向后推
在头文件中也可以这样做吗?
出什么事了
非常感谢您的帮助。不,这在全局范围内是不可能的,您需要在某个函数范围内执行
另外,关于编码风格的几点意见:
- 你不应该使用
usingnamespace std
这是一种糟糕的编码风格,只有在教科书中才能将示例缩小,以便更好地放在书页上。使用std::说明符作为一种用途,为经常使用的东西声明私有类型,或者在标头声明的命名空间中,甚至在类中使用更具体的使用声明,如使用std::vector
- 你不应该在头文件中定义全局变量,如果头文件包含在多个源文件中,事情就会爆炸,而应该在头文件中声明全局外部变量,并创建一个定义和初始化全局变量的源文件
不,这在全局范围内是不可能的,您需要在某个功能范围内执行
另外,关于编码风格的几点意见:
- 你不应该使用
usingnamespace std
这是一种糟糕的编码风格,只有在教科书中才能将示例缩小,以便更好地放在书页上。使用std::说明符作为一种用途,为经常使用的东西声明私有类型,或者在标头声明的命名空间中,甚至在类中使用更具体的使用声明,如使用std::vector
- 你不应该在头文件中定义全局变量,如果头文件包含在多个源文件中,事情就会爆炸,而应该在头文件中声明全局外部变量,并创建一个定义和初始化全局变量的源文件
胡安科潘扎是对的,你不能在函数之外调用函数(比如push_back)。您必须编写一个函数来初始化变量,如下所示:
//file.h
vector<Int_t> pdgCodeID;
void InitializeCodeID();
Juanchopanza是对的,你不能在函数之外调用函数(比如push_back)。您必须编写一个函数来初始化变量,如下所示:
//file.h
vector<Int_t> pdgCodeID;
void InitializeCodeID();
不能在函数外使用表达式语句。另外,将向量放在标题中也是一个坏主意。如果使用initilizer list而不是push_-back方法,则可以避免该错误。比如说
vector<Int_t> pdgCodeID = {
0, // other
22, // photon
111, // pi0
-211, // pim
211, // pip
221, // eta
130, // K0L
310, // K0s
-321, // Km
321, // Kp
-2112, // (a)n
2112, // n
2212, // p
3122 // Lambda
};
向量pdgCodeID={
0,//其他
22,//光子
111,//pi0
-211,//pim
211,//pip
221,//埃塔
130,//K0L
310,//K0s
-321,//Km
321,//Kp
-2112,/(a)n
2112,//n
2212,//p
3122//Lambda
};
您不能在函数外使用表达式语句。另外,将向量放在标题中也是一个坏主意。如果使用initilizer list而不是push_-back方法,则可以避免该错误。比如说
vector<Int_t> pdgCodeID = {
0, // other
22, // photon
111, // pi0
-211, // pim
211, // pip
221, // eta
130, // K0L
310, // K0s
-321, // Km
321, // Kp
-2112, // (a)n
2112, // n
2212, // p
3122 // Lambda
};
向量pdgCodeID={
0,//其他
22,//光子
111,//pi0
-211,//pim
211,//pip
221,//埃塔
130,//K0L
310,//K0s
-321,//Km
321,//Kp
-2112,/(a)n
2112,//n
2212,//p
3122//Lambda
};
您不应该在头文件中定义任何一个,因为如果将头文件包含在多个源文件中,将出现多个定义错误。如果您确实想要一个全局文件,请在标题中声明它:
extern std::vector<Int_t> pdgCodeID; // don't use namespace std
extern std::vector pdgCodeID;//不要使用名称空间std
并在源文件中定义它:
std::vector<Int_t> pdgCodeID = /* initialiser */;
std::vector pdgCodeID=/*初始化器*/;
在C++11中,这很简单:可以像处理数组一样使用括号初始化。但由于某些原因,您没有使用它,最好的选择可能是使用函数的结果初始化它:
std::vector<Int_t> make_pdgCodeID() {
std::vector<Int_t> result;
result.push_back(0);
// and so on
return result;
}
std::vector<Int_t> pdgCodeID = make_pdgCodeID();
std::vector make_pdgCodeID(){
std::向量结果;
结果:推回(0);
//等等
返回结果;
}
std::vector pdgCodeID=makeu pdgCodeID();
或者,Boost有一个更通用的初始化和分配2011年以前的容器的方法。您不应该在头中定义这两个容器,因为如果您将头包含在多个源文件中,将出现多定义错误。如果您确实想要一个全局文件,请在标题中声明它:
extern std::vector<Int_t> pdgCodeID; // don't use namespace std
extern std::vector pdgCodeID;//不要使用名称空间std
并在源文件中定义它:
std::vector<Int_t> pdgCodeID = /* initialiser */;
std::vector pdgCodeID=/*初始化器*/;
在C++11中,这很简单:可以像处理数组一样使用括号初始化。但由于某些原因,您没有使用它,最好的选择可能是使用函数的结果初始化它:
std::vector<Int_t> make_pdgCodeID() {
std::vector<Int_t> result;
result.push_back(0);
// and so on
return result;
}
std::vector<Int_t> pdgCodeID = make_pdgCodeID();
std::vector make_pdgCodeID(){
std::向量结果;
结果:推回(0);
//等等
返回结果;
}
std::vector pdgCodeID=makeu pdgCodeID();
或者,Boost有一个更通用的初始化和分配2011年以前的容器的方法。您不能在函数之外调用类似的函数。你可以用c