2015-10-20 74 views
0

我有一個類,我想要一個向量生活的程序的生活,所以我使用一個靜態向量。我如何添加一個靜態向量到一個類

請看我的代碼,並告訴我他們是否更好的使用靜態變量。

static std::vector<std::string> Stack; 


class Test 
{ 


public: 
void AddStack(std::string str) 
void PopStack() 

}; 


void Test::AddStack(std::string str) 
{ 

Stack.insert(Stack.end(),str.begin(),str.end()); 

} 


void Test::PopStack() 
{ 

    if(!Stack.empty()) 
    { 
     Stack.pop_back(); 

    } 

} 
+0

你是否對你有這麼遠的某個特定代碼的問題?至少,你可以考慮使'Stack'變量成爲'Test'類的'static'成員,而不是全局變量。順便說一句,你確定你打算使用'Stack.insert(Stack.end(),str.begin(),str.end());'而不是'Stack.push_back(str);'而不是? ' –

+0

代碼工作正常,但我相信我寫我的代碼的方式不是最好的方式。 –

回答

4

選項1

由於Stack在的Test成員函數的實現單獨使用,使該類的privatestatic成員變量。

class Test 
{ 
    public: 
     void AddStack(std::string str); 
     void PopStack(); 

    private: 
     static std::vector<std::string> Stack; 
}; 

並在cpp文件,添加:

std::vector<std::string> Test::Stack; 

選項2

使Stack可用的Test成員函數通過函數調用而不是可變的。

class Test 
{ 
    public: 
     void AddStack(std::string str); 
     void PopStack(); 

    private: 
     static std::vector<std::string>& getStack(); 
}; 

實現:

std::vector<std::string>& getStack() 
{ 
    static std::vector<std::string> Stack; 
    return Stack; 
} 

void Test::AddStack(std::string str) 
{ 
    auto& Stack = getStack(); 
    Stack.insert(Stack.end(),str.begin(),str.end()); 
} 

void Test::PopStack() 
{ 
    auto& Stack = getStack(); 
    if(!Stack.empty()) 
    { 
     Stack.pop_back(); 
    } 
} 

選項3

Test獨立的,並讓Stack類的非static成員。

class Test 
{ 
    public: 

     static Test& instance(); 
     void AddStack(std::string str); 
     void PopStack(); 

    private: 
     std::vector<std::string> Stack; 
}; 

實現:

Test& Test::instance() 
{ 
    static Test theInstance; 
    return theInstance; 
} 

void Test::AddStack(std::string str) 
{ 
    Stack.insert(Stack.end(),str.begin(),str.end()); 
} 

void Test::PopStack() 
{ 
    if(!Stack.empty()) 
    { 
     Stack.pop_back(); 
    } 
} 

,並用它作爲:

Test::instance().AddStack("abcd"); 
Test::instance().PopStack(); 
+1

可能還提到'Test :: Stack'變量的存儲聲明應該在.cpp文件中,而不是在聲明'Test'類的.h文件(如果有的話)中,否則包含.h文件的每個單元都將獲得自己的Stack變量的副本,並且這將導致難以排除故障的衝突運行。 –

+1

我可能會盡可能地讓'Stack'成爲'Test'的一個**非** - 靜態成員,然後在項目的主源代碼中創建一個「Test」的單個/靜態實例。最終效果是相同的 - 程序生命週期中的一個「Stack」實例 –

0

你必須小心地使用靜態變量的話,建議可以考慮一下先:

  1. 動態內存分配。當需要更多空間時,向量有不良習慣來重新分配內存,而且我不確定動態內存分配對靜態變量的影響,因爲靜態變量是在堆中創建的,並且您不希望存在碎片內存。實現將取決於編譯器,可能還有一些奇特的選擇。

  2. 與該變量相關的類函數也必須是靜態的,因爲根據定義,靜態變量總是存在的,並且函數相關也必須總是存在(簡單的解釋方式)。換句話說,靜態函數只能訪問靜態變量進行修改,這意味着一堆靜態函數。

我建議一個很好的和簡單的「出口」變量,因爲我看到的,做這項工作沒有靜態變量的問題/限制。

blabla。^ h

export std::vector<std::string> my_no_static_vector; 

blabla.cpp

#include "blabla.h" 
std::vector<std::string> my_no_static_vector; 
+2

靜態向量的常量大小的控制塊(指針,大小和分配大小)將與任何靜態結構一樣存儲。 C++編譯器需要爲靜態對象安排構造函數以便以某種方式運行,並且該實現是特定於平臺的,但在'main'運行之前發生。當靜態向量的構造函數運行時,它將分配一個緩衝區並設置指針。這個分配將以與其他向量相同的方式完成,就像使用'new'一樣。同樣,'vector'局部變量不會在堆棧上分配它的緩衝區,只是控制結構。 –

+0

嘿!!,很好的答案,現在很清楚,謝謝! –

+0

另外,re:** 2 **:你可以從非靜態成員函數中訪問靜態類成員。如果您不訪問任何非靜態類成員,則該函數應該是靜態的,因此您可以在沒有該類實例的情況下調用它,並且因爲生成代碼來傳遞'this'指針沒有意義。你的第二句話是正確的,但它不是第一句的總結或換句話說。 –

相關問題