gpt4 book ai didi

c# - 计算每个派生类的类实例

转载 作者:IT老高 更新时间:2023-10-28 22:38:45 26 4
gpt4 key购买 nike

有没有办法让所有派生类计算它们的实例?如何(用 C++、C#、Java 之一编写代码)?

想象一下,我可以访问根类(例如对象),而其他所有类(直接或间接)都是从这个类派生的。我想要的是:

AnyDerivedClass.InstancesCount()

问题是,必须跟踪静态变量中的计数,但不可能将静态变量从基类“注入(inject)”到派生类中,这只适用于成员变量。也就是说,我必须写这样的东西:

class object 
{
private static int count = 0;
protected object() { ++count; }
protected ~object() { --count; }
public static InstancesCount() { return count; }
};

class derived : object
{
private static int count = 0;
public derived() { ++count; }
public ~derived() { --count; }
public static InstancesCount() { return count; }
}

这个功能显然是重复的,我不能把它放在基类中。注意有两种计算方法:如果有 7 个类derived1 实例和8 个类derived2 实例,则有(a) 15 个对象实例或(b) 0 个对象实例。我不在乎哪一个,因为我都做不到(使用合理实用的方法,例如想象 100 个类,其中一半在我无法修改的库中)。

当然,理论上可以创建 (some run-type type identifier) => int count 的映射,并使用丑陋、缓慢、基于 (run-time type) 的方法(至少在 C#、Java 中) )。

当然,如果我可以修改派生类,我可以使用复制粘贴(糟糕)、宏(是的,我知道)、混合(不是这些语言)等。但这仍然很丑。

这是一个特定的问题,但它发生在我身上好几次,我希望能够将静态成员“注入(inject)”到派生类中以优雅地解决问题。

非常感谢您的帮助。

编辑:感谢您的好回答,在 C++ 中也可能使用 CRTP(Curiously recurring template pattern),但在 C#/Java 中则不行(没有多重继承)。当然,必须有权访问派生类并添加这个基类,所以问题仍然存在(如果没有其他方法,这看起来最好)。

编辑 2:使用当前语言看起来是不可能的。每个类的静态部分都不是继承的(没错),但是没有与每个类关联的继承单例,所以这类问题不能这么优雅地解决。为了说明问题,请看以下代码:普通成员和静态成员是当前的 OOP 语言功能,“单例”(或任何单词)成员是我的建议/愿望:

class Base
{
static int sMemberBase;
int memberBase;

//my wish (note that virtual for methods is allowed!):
singleton int singletonMemberBase;
};
class Derived : Base
{
static int sMemberDerived;
int memberDerived;

//my wish (note that virtual for methods is allowed!):
singleton int singletonMemberDerived;
};

//taken apart: (note: XYZStatic classes do not derive)
class Base { int memberBase; }
class BaseStatic { int sMemberBase; } BaseStaticInstance;
class Derived : Base { int memberDerived; }
class DerivedStatic { int sMemberDerived; } BaseStaticInstance;
//note: Derived::sMemberBase is compile-time changed to Base::sMemberBase

//my wish: (note inheritance!)
class BaseSingleton { int singletonMemberBase; } BaseSingletonInstance;
class DerivedSingleton : BaseSingleton { int singletonMemberDerived; } DerivedSingletonInstance;

如果语言中有类似的东西,我的问题的解决方案将是简单而优雅的:

//with singleton members, I could write counter like this:
class object
{
singleton int count;
object() { ++count; }
~object() { --count; }
};

最佳答案

在 C++ 中,您可以使用模板基类来实现。基本上它一个mixin,所以它仍然需要每个类通过从mixin继承来合作:

// warning: not thread-safe
template <typename T>
class instance_counter {
public:
static size_t InstancesCount() { return count(); }
instance_counter() { count() += 1; }
instance_counter(const instance_counter&) { count() += 1; }
// rare case where we don't need to implement the copy assignment operator.
protected:
~instance_counter() { count() -= 1; }
private:
static size_t &count {
static size_t counter = 0;
return counter;
}
};

class my_class: public instance_counter<my_class> {};

由于每个使用模板的类都有一个不同的基类,它有一个不同的 count函数,因此有一个不同的静态拷贝变量 counter.

从使用派生类作为模板参数实例化的模板类继承的技巧称为 CRTP。

关于c# - 计算每个派生类的类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4647277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com