http://ideone.com/1ohrsOРеализация статического конструктора в C++ не работает
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
какие проблемы вы на самом деле пытаетесь решить. Существует, несомненно, уже хорошо известное решение. –
Лучше размещать код в своем сообщении, а не ссылаться на код на другом сайте, который может исчезнуть. В любом случае конструктор вашего класса 'static_constructor' обращается к статическому члену' has_static_constructor' до того, как этот элемент будет создан. Результатом этого является неопределенное поведение в соответствии со стандартом C++. Это означает, что любое поведение приемлемо, включая то, что вы видите. – Peter
@Peter 'upt = & has_static_constructor :: v;' inside 'static_constructor()', должен инициализировать 'v', перед вызовом' push_back() '. Я что-то упускаю? – q126y