让默认构造函数访问一些可变状态而不使用全局变量

时间:2014-04-18 01:11:39

标签: c++

我希望有一个可以通过其默认构造函数构造的Allocator类,因为许多STL容器会尝试创建这样的分配器。

但是,我也希望分配者分享某些共同资源。

我目前的解决方案是拥有一个全局变量,表示各个对象在初始化时抓取的共享状态。例如,我做了这样的事情:

const int start = 0;

template<class T>
class Counter() {
 public:
  Counter() : x_(start) {}

  int increment() {
    return x_++;
  }

 private:
  int x_;
};

void SetStart(int s) {
  start = s;
}

有没有办法在这种设置中使用全局变量?我认为有可能创建某种类型的管理器类型,其子类型的构造函数访问适当的资源,但由于内部类不能访问C ++中外部类的成员变量,我不确定这是怎么回事工作

2 个答案:

答案 0 :(得分:3)

基本上,使用CRTP,您可以跟踪基类中的计数,并使用template template参数来维护使用类模板作为派生类型的能力。

template <template <typename> class T>
class counter
{
public:
    counter() { ++count;  }
protected:
    static int count;
};
template <template <typename> class T> int counter<T>::count(0);

template <typename T>
class X : counter<X>
{
public:
    X() : x_(count) {}
private:
    int x_;
};

...

X<int> x;  // x_ initialized to 1
X<int> x2; // x_ initialized to 2

答案 1 :(得分:0)

那么为什么不定义一个&#34; 分配器&#34; 1 课程,如果你需要它?

template<typename T> class someTemplatedClass;
class myAllocator{
      template<typename T> friend class someTemplatedClass;

      static unsigned int someNumber;
};
unsigned int myAllocator::someNumber = 0;

然后你可以在课堂上使用它:

template<typename T>
class someTemplatedClass{ 
   int someVariable;

   public:
      void write(){cout<<someVariable<<endl;};
      someTemplatedClass(){someVariable = myAllocator::someNumber++;};
};

计数器将持续通过所有专业化(因为它本身不是模板化的)。计数器在类范围之外也是不可见的,因为someNumber实际上是private。您也可以为了用户友好性而使myAllocator成为单身

或者,如果你需要它 - 你可以定义一个static void set(const int value) setter函数,它可以让你设置实例计数器的起始编号。

someTemplatedClass<int> array[10];
for(unsigned int i=0;i<10;i++)
   array[i].write();
someTemplatedClass<float> array2[5];
for(unsigned int i=0;i<5;i++)
   array2[i].write();

应打印从014的数字,因此计算所有 someTemplatedClass的实例。< / p>


1 这个例子甚至没有在分配器类附近,但你提到它,所以也许计数器只是一个例子而且它真的最终成为一个分配器。