0

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
4

2 回答 2

3

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

有预期的行为。

但最好完全避免那些全球性的。

于 2015-11-01T10:48:14.660 回答
0

您可能想看看这种订购代码的方式。它消除了所有初始化顺序依赖项,在我看来,它巧妙地将公共接口与静态数据的内部实现分开。

#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
于 2015-11-01T11:12:18.013 回答