簡體   English   中英

C++靜態成員初始化后重新初始化

[英]C++ static member reinitialized after initialization

我正在嘗試實現“HasUtility”模板類的設計,允許創建模板化靜態成員(實用程序)並維護所有實用程序(基類)的列表

這是代碼:

StaticUtilityBase.h:

#include <vector>
#include <iostream>

class StaticUtilityBase {
public:
    static std::vector<StaticUtilityBase*> all;
    StaticUtilityBase() {
        all.push_back(this);
        printAllState();
    }
    static void printAllState() {
        std::cout << "All size is " << all.size() << ", address is " << &all << std::endl;
    }
};

template <typename T> class StaticUtility : public StaticUtilityBase {};

template <typename T> class HasUtility  {
public:
    static StaticUtility<T> utility;
};

template <typename T> StaticUtility<T> HasUtility<T>::utility;

模板實用程序.cpp:

#include "StaticUtilityBase.h"
std::vector<StaticUtilityBase*> StaticUtilityBase::all;

和主要的:

#include <iostream>
#include "StaticUtilityBase.h"
class A {};
class B {};
int main() {
    std::cout << "Initializations done" << std::endl;
    StaticUtilityBase::printAllState();
    HasUtility<A>::utility; //Tell to the compiler that the static member is used so the constructor
    HasUtility<B>::utility; // of utility is used before main execution, during initializations
}

執行時,我有以下結果:

All size is 1, address is 0x562942baa1f0
All size is 2, address is 0x562942baa1f0
Initializations done
All size is 0, address is 0x562942baa1f0

最后,所有大小仍應為 2。 看起來“所有”在“實用程序”成員初始化后重新初始化! 地址是一樣的,所以我認為它是同一個對象。 也許它是從一個空的復制過來的?? 歡迎任何幫助!

我使用 gcc 和 C++17

您正在從不同靜態對象的構造函數(在本例中為template <typename T> StaticUtility<T> HasUtility<T>::utility; )訪問靜態對象(在本例中為StaticUtilityBase::all )。

由於跨翻譯單元的不同靜態對象的初始化之間沒有順序保證,因此您嘗試執行的操作將不起作用。

有關更多信息,請參閱https://en.cppreference.com/w/cpp/language/siof

驗證這一點的簡單方法是向StaticUtilityBase添加第二個靜態對象,該對象在構造時打印出來: static int printer = []()->int{std::cout << "Initing StaticUtilityBase\\n"; return 0;}() static int printer = []()->int{std::cout << "Initing StaticUtilityBase\\n"; return 0;}()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM