我遇到了一些继承类及其基类的问题。
例如:
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)。
我在这里缺少什么?
谢谢。
答案 0 :(得分:1)
我在这里缺少什么?
在我看来,您想要跟踪构造的对象数量,这些对象的类型派生自Base
。
在这种情况下,您需要counter
成为static
成员变量,这需要您add_counter
成为static
成员函数。
但是,这需要您:
Base
中添加复制构造函数,以确保使用复制构造函数创建的对象也被计算在内。以下是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