如何将静态向量添加到类

sum*_*ang 0 c++ visual-c++ c++11

我有一个类,我想要一个向量在程序的整个生命中都活着,所以我正在使用静态向量。

请查看我的代码,并告诉我它们是否是使用静态变量的更好方法。

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();

    } 

}
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 5

选项1

由于Stack仅用于实现成员函数Test,所以使a privatestatic类的成员变量成为可能。

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

   private:
         static std::vector<std::string> Stack;
};
Run Code Online (Sandbox Code Playgroud)

在.cpp文件中,添加:

std::vector<std::string> Test::Stack;
Run Code Online (Sandbox Code Playgroud)

选项2

Stack提供给的成员函数Test通过函数调用,而不是一个变量。

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

   private:
      static std::vector<std::string>& getStack();
};
Run Code Online (Sandbox Code Playgroud)

实现方式:

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();
   } 
}
Run Code Online (Sandbox Code Playgroud)

选项3

Test一个单身,使Stackstatic类的成员。

class Test
{
   public:

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

   private:
      std::vector<std::string> Stack;
};
Run Code Online (Sandbox Code Playgroud)

实现方式:

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();
   } 
}
Run Code Online (Sandbox Code Playgroud)

并将其用作:

Test::instance().AddStack("abcd");
Test::instance().PopStack();
Run Code Online (Sandbox Code Playgroud)