【问题标题】:How do I define a static variable inherited from a struct?如何定义从结构继承的静态变量?
【发布时间】:2014-09-02 23:51:49
【问题描述】:

我有一个带有结构的标题:

#ifndef CHARACTER_H_
#define CHARACTER_H_

#include <string>
using namespace std;

struct Character
{
    string name;
    static string type;
    static int baseHp, baseAttack, baseDefence;
};

#endif

我有一个继承该标头的类,我想在继承类的结构中定义静态变量。说我的继承类如下:

#include "Character.h"
#include <string>

class Rouge: private Character
{
public:
    Rouge(string name)
    {
        this->name = name;
    }
    string getName()
    {
        return name;
    }
};

我将在 Rouge 类中的什么位置定义在 Character 标头中声明的静态变量,我将如何去做?

【问题讨论】:

  • 您确定您了解声明和定义在多种情况下的区别吗?
  • @Steven:如果你故意使用不正确的词汇,人们应该怎么知道你在说什么?当然很重要。
  • @StevenFontaine 电气工程师在表示“安培”时不会说“伏特”,如果他们这样做了,人们会死,包括其他电气工程师。没有理由让 IT 更马虎。
  • @StevenFontaine:当我回答你的问题时,不明白你为什么向我抱怨人们没有提供帮助。术语很重要,这一点同样正确,因为专家可以通过启发式和直觉判断你真正想说什么。坦率地说,作为 OP,您没有资格走捷径并假设您的近似值是明确/不重要的。不要试图表现得粗鲁或混蛋之类的。
  • @StevenFontaine:啊,是的,这将是 Janeway 船长解决问题的方法:用熟悉的事物类比来解释困难的现实(“事件视界就像湖的冰冻表面"),假装类比是字面的,通过解决类比来行动(“我们只需要打破冰块!”),获利。不幸的是,这并不总是适用于 C++...

标签: c++ struct static


【解决方案1】:

您将它们定义为好像Rouge 不存在;他们是Character的成员:

string Character::type;
int    Character::baseHp;
int    Character::baseAttack;
int    Character::baseDefence;

因此,如果您期望从 Character 派生的每个类都不同,您会感到失望:数据成员不能被“覆盖”。

相反,通常会覆盖在基中声明但纯虚拟的getter函数,这样Character就会变成纯的,Rouge必须覆盖这些函数,这样该特定类型按需返回。

【讨论】:

  • 嗯,name 是唯一一个不是静态的。但我同意静态可能不是静态的。我认为 OP 正在尝试做一个元类型的事情,即应该在一个类型的所有实例之间共享一些信息。
  • @Cheersandhth.-Alf:哎呀
  • @Cheersandhth.-Alf 这正是我想要做的。无论实例如何,胭脂的类型始终是“胭脂”。这不是这样做的方法吗? (C++ 新手。我精通 Java,但我正在过渡。)
  • Rouge 也无法访问它们,因为继承是私有的
  • @StevenFontaine:很确定你的意思是流氓,顺便说一句?
【解决方案2】:

实现每个类型都可以覆盖的固定值的一种简单方法是使用产生这些值的虚函数:

class Animal
{
public:
    virtual
    auto number_of_tails() const -> int { return 0; }
};

class Doggie
    : public Animal
{
public:
    auto number_of_tails() const -> int override { return 1; }
};

我希望我把 override 关键字放在正确的位置。

如果您希望这些信息在没有类实例的情况下可用,只需用静态函数实现它:

class Doggie
    : public Animal
{
public:
    auto number_of_tails() const -> int override { return the_number_of_tails(); }

    static
    auto the_number_of_tails() const -> int { return 1; }
};

免责声明:编译器从未接触过代码。

【讨论】:

    猜你喜欢
    • 2017-02-07
    • 2019-04-28
    • 2011-08-05
    • 1970-01-01
    • 2016-09-10
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多