【问题标题】:Can static members be inherited separately?静态成员可以单独继承吗?
【发布时间】:2011-12-18 00:58:03
【问题描述】:

在 C++ 中,我有一个 Object 类,许多其他类(即 Ball、Paddle 和 Wall)都从该类继承。有没有办法让 Object 类上的静态成员作为单独的静态成员被每个子类继承?

基本上,我希望 Ball、Paddle 和 Wall 都有一个静态成员(用于存储用于绘图的图像),它们从 Object 继承(因为存储图像的数组是所有对象的共同要求),但是Ball、Paddle 和 Wall 中的每个静态成员都是独立的。这样每个 Ball 实例都可以访问球图像,每个 Paddle 都可以访问球拍图像,等等。

如果这是不可能的,那么实现类似功能的好方法是什么?

编辑:

关于我实际想要完成的事情的更多细节:

我正在开发一个突破克隆。我有一个 Object 类,所有游戏对象都从该类继承(Ball、Paddle、Block 和 Wall)。所有这些对象都有一些图像,它们需要访问才能绘制自己(这是由 Object* 对 std::list 中的所有对象完成的,并在所有对象上运行虚拟方法 updateAndDraw())。

现在,Ball、Paddle、Block 和 Wall 都有一个静态 sf::Texture(来自 SFML)数组,用于存储对象所需的所有图像。它是静态的,因为每个类的所有实例都可以共享图像,并且为每个实例单独加载它们会浪费内存。在第一次构造每个相应的游戏对象时,图像被加载并存储在数组中。

所有游戏对象的图像加载和存储功能基本相同,因此我想将其从每个单独的游戏对象移到 Object.我的计划是在 Object 上有一个静态成员,每个游戏对象都将继承,并且这个静态成员对于 Ball、Paddle、Block 和 Wall 都是独立的,尽管现在看起来这可能行不通。我还将在 Object 上有一个名为 loadImages(string filenames[]) 的静态方法,该方法将获取图像文件名数组并将图像加载到调用 loadImages() 的游戏对象的静态图像数组中。因此,在 Ball 构造函数中,如果我运行 loadImages() 并向其传递一些文件名,它会将图像加载到 Ball 的静态图像数组中,并且对于所有其他游戏对象都是相同的(独立地)。

在输入完所有内容后,我意识到将图像存储在其他地方可能会更好,并且只需为游戏对象提供指向这些图像的指针。这消除了图像数组是静态的需要,并且在构造函数中我可以调用一个函数来存储图像并将对象类型传递给它,它会给我一个指向游戏图像的指针数组对象需要。

【问题讨论】:

  • 我会创建一个单独的非静态类来提供图像,并在构建过程中为每个类提供这些图像。然后只需创建每个图像存储库类的单个实例,并在创建时将它们传递给每个新对象类。基本上,我会完全避免使用static,因为它使重构程序变得更加困难,并且使编写自动化测试变得更加困难。

标签: c++ oop inheritance object static


【解决方案1】:

没有是不可能的。但是,您可以在每个子类中重新声明静态变量。

class A
{
public:
    static int MyStatic;
};

class B : public A
{
public:
    static int MyStatic;
}

class C : public A
{
public:
}

A::MyStatic 与 C::MyStatic 相同,但 B::MyStatic 不同。 我还是不明白你为什么要这样做。

不过,您也可以使用模板。

template <typename T>
struct MyStaticContainer
{
    static int MyStaticValue;
}

template <typename T>
int MyStaticContainer<T>::MyStaticValue = 0;

然后,您可以通过这种方式访问​​您的字段:

MyStaticContainer<A>::MyStaticValue = 10;
MyStaticContainer<B>::MyStaticValue = 20;
MyStaticContainer<C>::MyStaticValue = 30;

这些实际上是 3 个不同的静态字段。

【讨论】:

    【解决方案2】:

    将所有这些都作为非静态成员可能是最容易的。考虑使用名为“getimages()”(或任何适当的)的虚函数,这样基类就可以访问特定于类的图像,而无需了解派生类的详细信息。

    在我提出最终建议之前,了解更多关于你的类设计以及这些方法和成员应该做什么会很有帮助。 Salvatore 关于使用模板的建议也可能是合适的,但在继承或委托模型就足够的情况下,模板经常被滥用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2013-05-09
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多