考虑一个C++类,它导出一个枚举,在该枚举上维护一个内部数组,并希望导出一个接受枚举值的命令.
class foo {
public:
enum color {
red,
yellow,
green,
NUM_COLORS
};
private:
something somebody[NUM_COLORS];
public:
void command(color c);
};
Run Code Online (Sandbox Code Playgroud)
是否有一种干净的方法只能导出实际颜色,而不是NUM_COLORS?当编译器的类型系统真的应该能够为我做这件事时,我不想在每次调用时检查边缘情况.
明显的黑客是:
class foo {
public:
enum color {
red,
yellow,
green
};
private:
/* something like */ const unsigned NUM_COLORS = green+1;
unsigned LEDs_in_stock[NUM_COLORS];
public:
void command(color c);
};
Run Code Online (Sandbox Code Playgroud)
这当然是一个滴答作响的定时炸弹,等待一些可怜的过度工作的维护程序员添加蓝色LED的配置,并忘记更新NUM_COLORS行.
让我澄清一下.在这种特殊情况下,我想要的是能够说:
class foo {
public:
enum color {
red,
yellow,
green
};
void command(color c);
private:
something somebody[color];
};
Run Code Online (Sandbox Code Playgroud)
据我所知,C++不允许这样做.
考虑一个继承自Foo和Baz的Waldo类,即:
class Waldo : public Foo, public Baz {
...
};
Run Code Online (Sandbox Code Playgroud)
当我创建一个新的Waldo实例时:
Waldo *w = new Waldo;
Run Code Online (Sandbox Code Playgroud)
Foo和Baz构造函数会被调用吗?如果默认情况下没有调用它们,那么在类声明或Waldo构造函数的声明/定义中是否有一种简单的方法可以强制它们被调用?
(看起来我可能正在尝试进行构造函数链接,据说C++不这样做.我不确定.)
我正在尝试做的是"注释"各种类声明,其中注释导致(除此之外)注释类的实例被链接到由注释类维护的列表中.例如,这让我可以使用Baz特性遍历所有对象的列表,对它们应用某个操作,而不必担心我是否记得将实例添加到具有Baz特性的对象列表中,因为构造函数自动完成它.
好的,今天我遇到了这个问题,那时TI TMS470 C++编译器拒绝接受它.
这来自"Head First Design Patterns"示例代码的C++版本的Silver版本.
class foo {
...
protected:
virtual ~foo() = 0 {}; // compiler barfs on this line
};
Run Code Online (Sandbox Code Playgroud)
编译器拒绝接受"= 0"(纯虚拟)和"{}"的组合(我猜这是为了让派生类无论如何都要抛出析构函数.
究竟他们试图用这条线做什么,它真的是合法的C++,它有多重要?