如何向类中添加静态向量

时间:2015-10-20 04:28:03

标签: c++ c++11 visual-c++

我有一个课程,我想要一个矢量生活在程序的生命中,所以我使用静态矢量。

请查看我的代码并告诉我他们是否更好地使用静态变量。

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

    } 

}

2 个答案:

答案 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 :(得分:0)

你必须小心静态变量,我建议先考虑一下:

  1. 动态内存分配。当需要更多空间时,向量具有重新分配内存的坏习惯,并且我不确定动态内存分配对静态变量的影响,因为静态变量是在堆中创建的,并且您不希望存在碎片内存。实现将取决于编译器,并且可能是它的一些奇特选项。

  2. 与该变量相关的类函数也必须是静态的,因为根据定义,静态变量总是存在,并且函数相关也必须始终存在(简单的解释方式)。换句话说,静态函数只能访问静态变量进行修改,这意味着一堆静态函数。

  3. 我建议一个好的,简单的“导出”变量,正如我所看到的那样,没有静态变量的问题/限制。

    blabla.h

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

    blabla.cpp

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