我有一个课程,我想要一个矢量生活在程序的生命中,所以我使用静态矢量。
请查看我的代码并告诉我他们是否更好地使用静态变量。
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 :(得分:4)
选项1
由于Stack
仅用于Test
的成员函数的实现,因此请将其设为该类的private
和static
成员变量。
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 :(得分:0)
你必须小心静态变量,我建议先考虑一下:
动态内存分配。当需要更多空间时,向量具有重新分配内存的坏习惯,并且我不确定动态内存分配对静态变量的影响,因为静态变量是在堆中创建的,并且您不希望存在碎片内存。实现将取决于编译器,并且可能是它的一些奇特选项。
与该变量相关的类函数也必须是静态的,因为根据定义,静态变量总是存在,并且函数相关也必须始终存在(简单的解释方式)。换句话说,静态函数只能访问静态变量进行修改,这意味着一堆静态函数。
我建议一个好的,简单的“导出”变量,正如我所看到的那样,没有静态变量的问题/限制。
blabla.h
export std::vector<std::string> my_no_static_vector;
blabla.cpp
#include "blabla.h"
std::vector<std::string> my_no_static_vector;