Реализация статического конструктора в 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

2 ответа

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);

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

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

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

#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
Другие вопросы по тегам