在 C++ 中更改基 class 值
Changing base class value in c++
我正面临一些继承 classes 及其基础 class 的问题。
例如:
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){}
}
我继承的每个 classes(我有几个)它们都通过彼此不同的 x,y。然后我希望这个计数器在我调用它时递增。
我面临的问题是计数器仅在该次迭代时增加。没有对象正在重建(因为我调试过)。如果我为 class1 调用 add_counter,它将从 1 增加到 2,但如果我再次调用它,它将是相同的(1 到 2)。
我在这里错过了什么?
谢谢。
What am I missing here?
在我看来,您想跟踪构造的对象的数量,这些对象的类型派生自 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
。您可以创建一个 class 模板来简化该过程。
示例:
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
我正面临一些继承 classes 及其基础 class 的问题。
例如:
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){}
}
我继承的每个 classes(我有几个)它们都通过彼此不同的 x,y。然后我希望这个计数器在我调用它时递增。
我面临的问题是计数器仅在该次迭代时增加。没有对象正在重建(因为我调试过)。如果我为 class1 调用 add_counter,它将从 1 增加到 2,但如果我再次调用它,它将是相同的(1 到 2)。
我在这里错过了什么?
谢谢。
What am I missing here?
在我看来,您想跟踪构造的对象的数量,这些对象的类型派生自 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
。您可以创建一个 class 模板来简化该过程。
示例:
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