gpt4 book ai didi

c++ - 在初始化时使用基类的 const

转载 作者:行者123 更新时间:2023-11-30 02:22:36 25 4
gpt4 key购买 nike

假设有一个具有常量值的基类,一个派生自基类的中间子类,以及一个派生自中间类的最终派生类。

如果我们想在派生类的初始化列表中使用常量,应该怎么做?

这是一个示例代码:

#include <iostream>

class Base{
protected:
const std::size_t c;

Base() : c(64){}
};

class Intermediate : public Base{
public:
Intermediate(int val){
std::cout << "In Intermediate c is " << c << std::endl; // In Intermediate c is 64
std::cout << "However, val = " << val << std::endl; // However, val = 10
}
};

class Derived : public Intermediate{
public:
Derived(int val) : Intermediate(this->c+val){
std::cout << "In Derived c is " << c << std::endl; // In Derived c is 64
}
};

int main(){
Derived instance(10);

return 0;
}

期望的输出是 74,但是在调用 Derived 类的初始化列表时 c 还没有被初始化。

我看到的可能的解决方案是:

  1. 使常量静态化
  2. 创建一个 setter 方法
  3. 多重继承

但是,我想保持整体结构不变(初始化列表)并且没有构造函数主体,所以如何在初始化期间使用基类中的常量?

最佳答案

您在处理构造函数之前使用了该值。您使用了 c 符号作为构造函数的参数,结果造成了先有鸡还是先有蛋的问题。

在编译器中启用-Wall 开关来捕获此类问题。
编译器警告您您正在做一些可疑的事情:

https://wandbox.org/permlink/DIYaSQQ4FQQwsmkO

prog.cc: In constructor 'Derived::Derived(int)':
prog.cc:20:47: warning: '*<unknown>.Derived::<anonymous>.Intermediate::<anonymous>.Base::c' is used uninitialized in this function [-Wuninitialized]
Derived(int val) : Intermediate(this->c+val){
~~~~~~^

正确的修复方法是不要使用魔数(Magic Number)(在某种程度上就是这个问题): https://wandbox.org/permlink/1nfa3eXP2XIhgRE8

class Base{
protected:
static const std::size_t cDefaultValue = 64;
const std::size_t c;

Base() : c(cDefaultValue){}
};

class Intermediate : public Base{
public:
Intermediate(int val){
std::cout << "In Intermediate c is " << c << std::endl; // In Intermediate c is 64
std::cout << "However, val = " << val << std::endl; // However, val = 10
}
};

class Derived : public Intermediate{
public:
Derived(int val) : Intermediate(cDefaultValue + val){
std::cout << "In Derived c is " << c << std::endl; // In Derived c is 64
}
};

另一种解决方法是合成。遗憾的是,大多数开发人员倾向于过度使用继承,而在大多数情况下,组合是更好的选择。

关于c++ - 在初始化时使用基类的 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47092968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com