初始化vector类型的静态类成员



我有一个私有静态实例变量类型为vector>的类。我有一个初始化这个变量的策略,它涉及将一个临时数组传递给一个不是类成员的函数。

我是这样做的:

initclass.cpp:

#include "initclass.h"
#define NINT 5
vector<pair<int,int> > initInstance(const pair<int,int> *array, int nint)
{
  vector<pair<int,int> > vect;
  vect.assign(array, array + nint);
  return vect;
}
const vector<pair<int,int> > initclass::_intvect = 
  initInstance((pair<int,int>[NINT]){pair<int,int>(1,2), pair<int,int>(3,4), 
                                     pair<int,int>(5,6), pair<int,int>(7,8), 
                                     pair<int,int>(9,10)}, 
    NINT);

initclass.h:

#ifndef INITCLASS_H_
#define INITCLASS_H_
#include <utility>
#include <vector>
using namespace std;
class initclass
{
public:      
  static const vector<pair<int,int> > & intvect() { return _intvect; };
private:
  const static vector<pair<int,int> > _intvect;      
};
#endif

我可以通过在调用initInstance函数之前声明一对对象的数组来完成这项工作,但我想知道是否有更好的方法(这当然是我试图做的一个简化的例子:在我的实际代码中,有许多调用初始化函数与许多数组,我宁愿不声明每个函数之前调用)。

编辑:我认为简要地我找到了一个解决方案:使用数组初始化列表作为临时在c++ 11?

第二个答案从const数组转换为(非const)指针。在我的情况下,这将改变initInstance函数调用为:

const vector<pair<int,int> > initclass::_intvect = initInstance((pair<int,int>*)(const pair<int,int> []){pair<int,int>(1,2), pair<int,int>(3,4), pair<int,int>(5,6), pair<int,int>(7,8), pair<int,int>(9,10)}, NINT);

可以编译,但是由于某些原因,initInstance函数永远不会被调用。

是的,有更好的方法。你可以删除这个可怕的函数,它没有任何用处。你可以这样初始化vector:

#include <iostream>
#include <vector>
#include <utility>


struct A
{
    const static std::vector<std::pair<int,int> > intvect;
};
const std::vector<std::pair<int,int> > A::intvect{ std::pair<int,int>(1,2), std::pair<int,int>(3,4), 
                                                   std::pair<int,int>(5,6), std::pair<int,int>(7,8), 
                                                   std::pair<int,int>(9,10) };
int main()
{
    (void) A::intvect;
}

这是使用c++11的第7个vector构造函数——带初始化列表的构造函数

相关内容

  • 没有找到相关文章

最新更新