初始化 const 成员并使用父构造函数

本杰明·克里斯托弗森

继承T和使用时,有没有办法在模板中初始化 const 成员using T::T这是一个例子

#include <iostream>
#include <ctime>
#include <string>
#include <memory>

class A {
protected:
  int wake_up_time_;

public:
  A(int wake_up_time): wake_up_time_(wake_up_time) { }

  virtual void hello() const {
    std::cout << "I wake up at " << wake_up_time_;
  }
};

/* B classes inherit from A and have different members some of which vary in  
 * size and type                                                             */
class B1 : public A {
public:
  std::string b;

  B1(int a, std::string b): A(a), b(b) { }
};

class B2 : public A {
public:
  int c;
  double d;

  B2(int a, int c, double d): A(a), c(c), d(d) { }
};

template<class T>
class bird : public T {
  /* this function is more expensive in my case. */
  bool is_early_bird() const { // needs to be const as hello is const
    return this->wake_up_time_ < 6;
  }

  /* would like to have this instead */
  // const bool is_early_bird_;

public:
  /* which we assign in the constructor */
  using T::T;

  void hello() const override { 
    std::cout << (is_early_bird() ? "I am an early bird!" : "Getting up is hard...")
              << std::endl;
  }
};

template<class T>
class cat : public T {
  /* similar comments as in bird class */
  bool is_hunting() const {
    return this->wake_up_time_ < 5 || this->wake_up_time_ > 22;
  }

public:
  using T::T;

  void hello() const override {
    std::cout << (is_hunting() ? "Time to kill stuff" : "Time to sleep")
              << std::endl;
  }
};

int main() {
  std::unique_ptr<A> ptr;
  {
    ptr.reset(new bird<B1>(5, "..."));
    std::cout << "B1 has value " << dynamic_cast<B1*>(ptr.get())->b << std::endl;
  }
  ptr->hello();

  {
    ptr.reset(new cat<B1>(12, "xyz"));
    std::cout << "B1 has value " << dynamic_cast<B1*>(ptr.get())->b << std::endl;
  }
  ptr->hello();

  {
    ptr.reset(new cat<B2>(24, 3, 12.5));
    B2* l_ptr = dynamic_cast<B2*>(ptr.get());
    std::cout << "B2 has value " << l_ptr->c << " and " << l_ptr->d << std::endl;
  }
  ptr->hello();

  {
    ptr.reset(new B2(10, 7, 3.33));
    B2* l_ptr = dynamic_cast<B2*>(ptr.get());
    std::cout << "B2 has value " << l_ptr->c << " and " << l_ptr->d << std::endl;
  }
  ptr->hello();

  return 0;
}

输出是

B1 has value ...
I am an early bird!
B1 has value xyz
Time to sleep
B2 has value 3 and 12.5
Time to kill stuff
B2 has value 7 and 3.33
I wake up at 10   

我想要摆脱的是(在这种情况下是简单的)计算,cat::is_huntingbird::is_early_bird改为使用 const 成员。我还有很多函数将引用或指向B1B2的指针作为参数,因此它似乎不是拥有public cat : public Apublic bird : public A类并以 2x2 继承的 B 类结尾的选项

本杰明·克里斯托弗森

WF在评论区给出了答案。答案是改变,例如,cat

template<class T>
class cat : public T {
  const bool is_hunting_ = { this->wake_up_time_ < 5 || this->wake_up_time_ > 22 };

public:
  using T::T;

  void hello() const override {
    std::cout << (is_hunting_ ? "Time to kill stuff" : "Time to sleep")
              << std::endl;
  }
};

template<class T>
class cat : public T {
  /* similar comments as in bird class */
  bool is_hunting() const {
    return this->wake_up_time_ < 5 || this->wake_up_time_ > 22;
  }

public:
  using T::T;

  void hello() const override {
    std::cout << (is_hunting() ? "Time to kill stuff" : "Time to sleep")
              << std::endl;
  }
};

这是在这个网站上描述的

成员初始化
非静态数据成员可以通过以下两种方式之一进行初始化:
...
2) 通过默认成员初始化器,它只是包含在成员声明中的大括号或等号初始化器,如果成员在成员初始值设定项列表。
...

用法
非静态数据成员或非静态成员函数的名称只能出现在以下三种情况:
1) 作为类成员访问表达式的一部分,其中类要么具有此成员,要么派生自具有此成员的类,包括this->在任何允许使用的上下文中使用非静态成员名称时出现的隐式成员访问表达式...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在类中初始化const成员变量?

来自分类Dev

静态const成员变量初始化

来自分类Dev

用已删除的副本构造函数初始化const引用成员

来自分类Dev

奇怪的未初始化const成员行为

来自分类Dev

初始化const成员变量

来自分类Dev

初始化列表中const引用成员的初始化

来自分类Dev

如何初始化需要执行计算的const成员?

来自分类Dev

委托复制构造函数和const数据初始化

来自分类Dev

声明时无法使用初始化列表初始化const char * / string数组的向量

来自分类Dev

C ++:通过一个初始化函数对多个数据成员进行const初始化

来自分类Dev

在C ++中的自定义类的构造函数中初始化没有参数的静态const类成员

来自分类Dev

类外部的静态const成员初始化

来自分类Dev

可以在C ++构造函数中初始化const成员吗?

来自分类Dev

如何使用std :: array构造函数参数C ++列表初始化const std :: array成员

来自分类Dev

静态const成员初始化中的sizeof

来自分类Dev

从C中的函数初始化静态const变量

来自分类Dev

在可变参数构造函数中初始化const数组

来自分类Dev

内联初始化静态const类成员的初始化顺序保证

来自分类Dev

每个构造函数成员初始化器列表初始化const数据成员,错误:没有匹配的调用函数

来自分类Dev

更改后在构造函数中初始化const变量

来自分类Dev

如何初始化const循环引用成员

来自分类Dev

使用来自函数(MPI_comm_size / rank)的数据初始化C ++ const成员

来自分类Dev

使用C ++类中的复杂函数初始化const成员

来自分类Dev

在类构造函数中初始化const向量(C ++)

来自分类Dev

在构造函数中使用输出参数函数初始化const成员的调用的代码比lambda简单

来自分类Dev

从构造函数中的std :: istream初始化const类数据成员

来自分类Dev

为什么在构造函数初始化程序中初始化 const char 数组成员不兼容?

来自分类Dev

如何在构造函数中初始化 int const * const?

来自分类Dev

构造函数体中的 C++ 类 const 成员初始化

Related 相关文章

  1. 1

    如何在类中初始化const成员变量?

  2. 2

    静态const成员变量初始化

  3. 3

    用已删除的副本构造函数初始化const引用成员

  4. 4

    奇怪的未初始化const成员行为

  5. 5

    初始化const成员变量

  6. 6

    初始化列表中const引用成员的初始化

  7. 7

    如何初始化需要执行计算的const成员?

  8. 8

    委托复制构造函数和const数据初始化

  9. 9

    声明时无法使用初始化列表初始化const char * / string数组的向量

  10. 10

    C ++:通过一个初始化函数对多个数据成员进行const初始化

  11. 11

    在C ++中的自定义类的构造函数中初始化没有参数的静态const类成员

  12. 12

    类外部的静态const成员初始化

  13. 13

    可以在C ++构造函数中初始化const成员吗?

  14. 14

    如何使用std :: array构造函数参数C ++列表初始化const std :: array成员

  15. 15

    静态const成员初始化中的sizeof

  16. 16

    从C中的函数初始化静态const变量

  17. 17

    在可变参数构造函数中初始化const数组

  18. 18

    内联初始化静态const类成员的初始化顺序保证

  19. 19

    每个构造函数成员初始化器列表初始化const数据成员,错误:没有匹配的调用函数

  20. 20

    更改后在构造函数中初始化const变量

  21. 21

    如何初始化const循环引用成员

  22. 22

    使用来自函数(MPI_comm_size / rank)的数据初始化C ++ const成员

  23. 23

    使用C ++类中的复杂函数初始化const成员

  24. 24

    在类构造函数中初始化const向量(C ++)

  25. 25

    在构造函数中使用输出参数函数初始化const成员的调用的代码比lambda简单

  26. 26

    从构造函数中的std :: istream初始化const类数据成员

  27. 27

    为什么在构造函数初始化程序中初始化 const char 数组成员不兼容?

  28. 28

    如何在构造函数中初始化 int const * const?

  29. 29

    构造函数体中的 C++ 类 const 成员初始化

热门标签

归档