简体   繁体   English

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

[英]Initialise static class member of type vector

I have a class with a private static instance variable of type vector >. 我有一个带有向量类型>的私有静态实例变量的类。 I had a strategy for initialising this variable that involved passing a temporary array to a function that was not a class member. 我有一个初始化此变量的策略,该策略涉及将临时数组传递给不是类成员的函数。 This worked on older versions of g++, but not with g++ 4.8.2. 这适用于旧版本的g ++,但不适用于g ++ 4.8.2。

Here's what I'm doing: 这是我在做什么:

initclass.cpp: 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: 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

I can make this work by just declaring the array of pair objects before calling the initInstance function, but I'm wondering if there's a better way (this is of course a simplified example of what I'm trying to do: in my real code, there are many calls to the initialisation function with many arrays, and I'd rather not declare each of them prior to each function call). 我可以通过在调用initInstance函数之前声明一对对象的数组来完成这项工作,但是我想知道是否有更好的方法(这当然是我尝试做的简化示例:在我的真实代码中,有许多具有许多数组的初始化函数调用,而我宁愿不在每个函数调用之前声明它们。

EDIT: I thought briefly I'd found a solution here: Using array init list as temporary in C++11? 编辑:我想过一会儿我在这里找到了一个解决方案: 在C ++ 11中使用数组初始化列表作为临时列表?

The second answer has a conversion from a const array to a (non-const) pointer. 第二个答案是从const数组到(非const)指针的转换。 In my case this would change the initInstance function call to: 就我而言,这会将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);

This compiles, but the initInstance function never gets called, for some reason. 这样可以编译,但是由于某种原因,initInstance函数永远不会被调用。

Yes, there is a better way. 是的,有更好的方法。 You can remove that awful function, which does nothing useful. 您可以删除该功能,该功能没有任何用处。 You can initialize vector like this : 您可以像这样初始化向量:

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

This is using the c++11 7th constructor of vector - the one with taking initializer list. 这是使用向量的c ++ 11第七构造函数-带有初始值设定项列表的构造函数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM