Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;确保子类为常量提供自定义值_C++_Inheritance - Fatal编程技术网

C++ C++;确保子类为常量提供自定义值

C++ C++;确保子类为常量提供自定义值,c++,inheritance,C++,Inheritance,假设我们有一个抽象的类A,它有多个子类。每个具体类(不是对象)都有与其关联的优先级。存储此优先级的一种方法是在a中作为protected int prio 但是如何确保每个子类确实为prio设置一个值呢 我能想到的唯一方法是使用模板化并使类型具有优先级。我希望有一个更轻量级的方法 最简单的方法是使用经典覆盖。同一类的优先级总是相等的 class A { public: virtual int get_priority()=0; }; class B : A { public: int

假设我们有一个抽象的
类A
,它有多个子类。每个具体类(不是对象)都有与其关联的优先级。存储此优先级的一种方法是在
a
中作为
protected int prio

但是如何确保每个子类确实为
prio
设置一个值呢


我能想到的唯一方法是使用模板化并使类型具有优先级。我希望有一个更轻量级的方法

最简单的方法是使用经典覆盖。同一类的优先级总是相等的

class A {
public:
  virtual int get_priority()=0;
};


class B : A {
public:
  int get_priority() {
     return 2;
  }
};

class C : A {
public:
  int get_priority() {
    return 3;
  }
};
存储此优先级的一种方法是在
a
中作为
protected int prio

那是行不通的

如果你使用

static int prio;
int prio;
A
及其所有子类只有一个变量

如果你使用

static int prio;
int prio;
每个实例都会将其作为成员变量,这与为每个类创建值的目的背道而驰

您可以使用以下策略来最小化样板代码

class A { ... };

template <typename T>
struct PriorityHolder
{
   static int prio;
};

template <typename T> 
int PriorityHolder<T>::prio = <Find a suitable method for value>;

class Derived1 : public A,
                 public PriorityHolder<Derived1>
{
    ...
};
A类{…};
模板
结构优先持有人
{
静态int-prio;
};
模板
int PriorityHolder::prio=;
类别1:公共A,
公共优先权持有人
{
...
};

我看不到一种方法可以确保在子容器中初始化非静态数据成员。维护具有相同含义的不同静态数据成员也很棘手,而且容易出错。因此,我建议使用纯虚函数来动态获取子类的优先级。Pure virtual确保子类必须重写此getter:

class Base {
public:
    void print() const { std::cout << "prio: " << getPrio() << std::endl; }
protected:
    virtual int getPrio() const = 0;
};

class Sub1 : public Base {
    int getPrio() const override { return 1; }
};

class Sub2 : public Base {
    int getPrio() const override { return 2; }
};

int main()
{
    Sub1 s1;
    Sub2 s2;
    s1.print();
    s2.print();
    return 0;
}
类基{
公众:

void print()const{std::cout您考虑的是非静态成员
prio
还是静态成员?类a应该有一个接受int参数(prio)的受保护构造函数.@Richard Criten但如何确保类的每个对象的prio都是常量?@Stephan Lechner无论哪种方式都可以,静态可能更合适这听起来像是一个。