Как создать статический вектор объекта? - PullRequest
9 голосов
/ 23 сентября 2011

У меня есть класс 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}, а затем скопировать [] в вектор

Ответы [ 3 ]

17 голосов
/ 23 сентября 2011

Вы должны предоставить определение 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);
3 голосов
/ 23 сентября 2011

Добавьте определение статического объекта-члена в файл реализации вашего класса:

#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 голосов
/ 23 сентября 2011

Вы можете использовать статический помощник или использовать boost :: assign

1> с помощью небольшого помощника:

#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());
...