Как создать экземпляр статического вектора объекта?
у меня есть класс, который имеет статический вектор объектов. Объекты относятся к классу 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}, а затем скопировать a[] в вектор
3 ответов
вы должны предоставить определение 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);
добавить определение статического объекта-члена в файл реализации класса:
#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 это не так.
вы можете использовать статический помощник или использовать 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:: назначьте, какой eaiser, достаточно одной строки:
vector<B> A::vector_of_B = boost::assign::list_of(B())(B())(B())(B())(B());