vector — не работает реализация статического конструктора в c ++

http://ideone.com/1ohrsO

push_back вызывается внутри конструктора static_constructor, не отражается. Зачем?

#include <iostream>
#include <vector>
#include<memory>
#include<string>

using namespace std;

class has_static_constructor
{
public:
friend class static_constructor;
static vector<int> v;class static_constructor
{
public:

vector<int> * upt; //&v;
static_constructor()
{
cout<<"inside static_constructor";
upt = &has_static_constructor::v;
has_static_constructor::v.push_back(1);
has_static_constructor::v.push_back(20);
}

} ;

static std::unique_ptr<has_static_constructor::static_constructor> upt ;
};unique_ptr<has_static_constructor::static_constructor> has_static_constructor::upt(new has_static_constructor::static_constructor());

vector< int > has_static_constructor::v(2,100);

int main() {
// your code goes here

for (std::vector<int>::const_iterator i = has_static_constructor::v.begin(); i != has_static_constructor::v.end(); ++i)
{   std::cout << *i << ' ';
cout<<"\n I was here\n";
}

return 0;
}

Выход:

inside static_constructor100
I was here
100
I was here

0

Решение

static_constructor() называется раньше has_static_constructor::v инициализация.

Переехать

unique_ptr<has_static_constructor::static_constructor> has_static_constructor::upt(new has_static_constructor::static_constructor());

после

vector< int > has_static_constructor::v(2,100);

иметь ожидаемое поведение.

Но лучше избегать этих глобальных целей.

3

Другие решения

Возможно, вы захотите взглянуть на этот способ заказа кода. Он удаляет все зависимости порядка инициализации и, на мой взгляд, аккуратно отделяет открытый интерфейс от внутренней реализации статических данных.

#include <iostream>
#include <vector>class has_static_constructor
{
// note - all private

struct static_data {
static_data()
: _v(2, 100)
{
_v.push_back(1);
_v.push_back(20);
}
std::vector<int> _v;
};

static static_data& statics() {
static static_data sd;
return sd;
}

// public interface
public:

static std::vector<int>& v() { return statics()._v; }

};

auto main() -> int
{
for (const auto& i : has_static_constructor::v())
{
std::cout << i << std::endl;
}
return 0;
}

ожидаемый результат:

100
100
1
20
0

По вопросам рекламы [email protected]