在c ++

时间:2016-12-14 20:21:07

标签: c++ class inheritance increment base

我遇到了一些继承类及其基类的问题。

例如:

base class{

int x,y; // Doesnt really matter
int counter;

public:

class(int x, int y):x(x), y(y), counter(1){}

void add_counter(){counter++;}
//stuff
virtual ~base(){}
}



class1:public base{

 public:

 class1():base(1,2){}
 }

我继承的每一个类(我都有几个)都以不同的方式传递x,y。然后我希望这个计数器在我调用时递增。

我面临的问题是计数器仅在该迭代时增加。没有对象被重构(因为我调试了)。如果我为class1调用add_counter,它将从1增加到2,但如果我再次调用它,它将是相同的(1到2)。

我在这里缺少什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

  

我在这里缺少什么?

在我看来,您想要跟踪构造的对象数量,这些对象的类型派生自Base

在这种情况下,您需要counter成为static成员变量,这需要您add_counter成为static成员函数。

但是,这需要您:

  1. 减少析构函数中的计数。
  2. Base中添加复制构造函数,以确保使用复制构造函数创建的对象也被计算在内。
  3. 以下是base的简化版本:

    class base
    {
       public:
    
         base() { inrement_counter(); }
    
         base(base const& copy) { inrement_counter(); }
    
         virtual ~base(){ decrement_counter(); }
    
       private:
    
         static int counter;
         static void inrement_counter() {++counter;}
         static void decrement_counter() {--counter;}
    }
    
    int base::counter = 0;
    

    如果要跟踪构建的derived1个对象的数量,则需要将簿记代码添加到derived1。您可以创建一个类模板来简化该过程。

    示例:

    template <typename T>
    struct ObjectCounter
    {
       ObjectCounter() { inrement_counter(); }
    
       ObjectCounter(ObjectCounter const& copy) { inrement_counter(); }
    
       virtual ~ObjectCounter(){ decrement_counter(); }
    
       static int counter;
       static void inrement_counter(){++counter;}
       static void decrement_counter(){--counter;}
    };
    
    template <typename T>
    int ObjectCounter<T>::counter = 0;
    
    class base
    {
    };
    
    class derived1 : public base, public ObjectCounter<derived1>
    {
    };
    
    class derived2 : public base, public ObjectCounter<derived2>
    {
    };
    
    #include <iostream>
    
    int main()
    {
       derived1 d1;
       derived2 d2;
       auto d3 = d2;
    
       std::cout << d1.counter << std::endl;
       std::cout << d2.counter << std::endl;
    }
    

    输出:

    1
    2