微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在同一类构造函数中初始化静态std :: vector <class>的问题

如何解决在同一类构造函数中初始化静态std :: vector <class>的问题

|| 如何在类中正确声明静态向量? 目前我在一行上崩溃,因为向量初始化太晚了。 示例一:
#include \"stdafx.h\"
#include <vector>    
class A{
private:
    int aValue;
public:
    static std::vector<A*> listofA;

    A(int i)
    {
        aValue = i;
        A::listofA.push_back(this); // !!! HERE crash in release mode only,in debug mode items add to vector,but remove when vector initialize
    }
};

A testA(1);
std::vector<A*> A::listofA;



int _tmain(int argc,_TCHAR* argv[])
{
    return 0;
}
示例二: A类
#include <vector>

class A{
private:
    int aValue;
public:
    static std::vector<A*> listofA;

    A(int i);
};
A类
#include \"stdafx.h\"
#include \"classA.h\"

std::vector<A*> A::listofA;

A::A(int i)
{
  aValue = i;
  A::listofA.push_back(this); // !!! HERE crash in release mode only,but remove when vector initialize
}
main.cpp
#include \"stdafx.h\"
#include \"classA.h\"

A testA(1);

int _tmain(int argc,_TCHAR* argv[])
{
    return 0;
}
在示例2中,如果项目中的cpp文件具有此顺序(编译顺序),则一切正常: A类 main.cpp 如果订购此产品,我们将当机: main.cpp A类     

解决方法

        静态元素按照它们在文件中出现的顺序进行初始化,因此当您说:
A testA(1);
std::vector<A*> A::listOfA;
第一个静态变量已初始化,但其构造函数尝试使用第二个静态变量,但结果未定义。 如果静态文件位于不同的文件中,则初始化顺序不确定,因此,如果运气好的话,它似乎可以工作。通常,不要编写依赖于静态初始化顺序的代码。     ,        引用自:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14 有许多解决方案,但是一个非常简单且完全可移植的解决方案是用全局函数listOfA()替换全局对象listOfA,该函数通过引用返回对象。
std::vector<A*>& listOfA()
{
    static std::vector<A*> ans;
    return ans;
}
由于静态局部对象是在第一次控件流经其声明时构造的(仅),因此上述新的listOfA()语句仅会发生一次:第一次调用listOfA()。每个后续调用将返回相同的对象。然后,您要做的就是将listOfA的用法更改为listOfA():
int _tmain(int argc,_TCHAR* argv[])
{
    // do stuff
    A::listOfA().dostuff();
    // do stuff
}
之所以称其为“首次使用时构造”成语,是因为这样做:全局Fred对象是在首次使用时构造的。 这种方法的缺点是对象永远不会被破坏。还有另一种技术可以解决此问题,但由于使用它可能会引起另一个(同样令人讨厌的)问题,因此必须谨慎使用。 [编辑]很抱歉,没有看到您已经链接到常见问题解答。他应得的荣誉[/编辑]     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。