如何实例化对象的静态向量?

时间:2011-09-23 16:17:44

标签: c++ instantiation static-members

我有一个A类,它有一个静态的对象向量。对象属于B类

class A {
  public:
    static void InstantiateVector();
  private:
    static vector<B> vector_of_B;
}

在函数InstantiateVector()

for (i=0; i < 5; i++) {
  B b = B();
  vector<B>.push_back(b);
}

但是我使用visual studio 2008编译错误:未解析的外部符号...... 是否可以使用上述方法实例化静态向量?对于要创建的对象b,必须从输入文件中读取一些数据,并将其存储为b

的成员变量

或者它是不可能的,只有简单的静态向量是可能的?我在某处读到要实例化静态向量,你必须首先定义一个const int a [] = {1,2,3},然后将[]复制到vector

3 个答案:

答案 0 :(得分:17)

您必须提供vector_of_b的定义,如下所示:

// A.h
class A {
  public:
    static void InstantiateVector();
  private:
    static vector<B> vector_of_B;
};

// A.cpp
// defining it fixes the unresolved external:
vector<B> A::vector_of_B;

作为旁注,您的InstantiateVector()会制作许多可能(或可能不会)优化的不必要副本。

vector_of_B.reserve(5);  // will prevent the need to reallocate the underlying
                         // buffer if you plan on storing 5 (and only 5) objects
for (i=0; i < 5; i++) {
  vector_of_B.push_back(B());
}

事实上,对于这个简单的例子,你只是默认构造B个对象,最简洁的方法是简单地将循环全部替换为:

// default constructs 5 B objects into the vector
vector_of_B.resize(5);

答案 1 :(得分:3)

将静态成员对象的定义添加到类实现文件中:

#include "A.h"

std::vector<B> A::vector_of_B;

或者更确切地说,吸收和消除初始化程序:

std::vector<B> A::vector_of_B(5, B()); // same effect as `A::InstantiateVector()`

注意:在C ++ 98/03中,vector_of_B(5)vector_of_B(5, B())是相同的。在C ++ 11中,它们不是。

答案 2 :(得分:2)

您可以使用静态助手或使用boost :: assign

1&gt;使用小帮手:

#include <boost\assign.hpp>
class B{};

class A {
 public:
    static bool m_helper;
    static bool InstantiateVector()
    {
        for (int i=0; i < 5; ++i) 
        {
            B b;
            vector_of_B.push_back(b);
        }
        return true;
    }
private:
    static vector<B> vector_of_B;
};

bool A::m_helper = InstantiateVector();//helper help initialize static vector here

2 - ;使用boost :: assign这是eaiser,一行就足够了:

vector<B> A::vector_of_B = boost::assign::list_of(B())(B())(B())(B())(B());