C++ C++;std::在头文件中初始化并设置向量

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::vectors时遇到了一些问题

我在StackOverflow和Google上搜索了过去一个半小时,没有找到任何有用的东西

简单地说,我一直在使用一个在头文件中初始化和设置的数组。使用
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