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

时间:2014-03-12 01:30:12

标签: c++ arrays static instance-variables

我有一个带有类型为vector>的私有静态实例变量的类。我有一个初始化此变量的策略,涉及将临时数组传递给不是类成员的函数。这适用于旧版本的g ++,但不适用于g ++ 4.8.2。

这就是我正在做的事情:

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函数之前声明对对象数组来完成这项工作,但我想知道是否有更好的方法(这当然是我正在尝试做的简化示例:in我的真实代码,有许多数组调用初始化函数,我宁愿不在每个函数调用之前声明它们。)

编辑: 我简单地想到了我在这里找到了一个解决方案:Using array init list as temporary in 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函数永远不会被调用。

1 个答案:

答案 0 :(得分:1)

是的,还有更好的方法。你可以删除那个糟糕的功能,它没有任何用处。您可以像这样初始化矢量:

#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;
}

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