静态成员可以单独继承吗?

时间:2011-10-29 23:08:48

标签: c++ oop inheritance object static

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

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

如果不可能,那么允许类似功能的好方法是什么?

编辑:

我正在努力实现的更多细节:

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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个不同的静态字段。

答案 1 :(得分:1)

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

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