我的问题看起来像是在SO上发现的大约一百万个问题的副本,但我找不到令人满意的解决方案。
我正在为一个特定的文件格式开发一个小的导入/导出dll,它是一个类似块的结构,不同类型的块互相引用。
编辑:每种块类型都有自己的功能,并提供不同数据类型的不同信息,依此类推。所以他们不只是为他们的链接提供别名。对于这种混乱感到抱歉,我把它们分解为尽可能简单,只是描述我遇到的问题。
因此,每个数据块都有一些信息,并保存一个指向其他块(可能为空)的链接列表。链接只是64位值,表示文件中的绝对字节偏移量。
继承的典型案例:BaseBlock和一些派生块类型。
由于每个块都可以有一些链接,我给了我的基类一个链接数组,并实现了一个方法,该方法返回由作为“命名索引”的枚举指定的链接:
typedef uint64_t LINK;
class BaseClass
{
public:
enum BlockLink;
LINK getLink(BlockLink link) {
if(m_link_count < link) {
return m_links[link];
}
return 0;
}
private:
LINK* m_links;
uint64_t m_link_count;
}
在每个派生类中,我将定义此枚举,如:
Class ABlock: public virtual BaseBlock
{
public:
enum BlockLink {
link_to_f_block = 0,
link_to_another_f_block = 1,
...
link_to_d_block = 5
}
}
Class BBlock: public virtual BaseBlock
{
public:
enum BlockLink {
link_to_nice_a_block = 0,
link_to_evil_h_block = 1,
...
link_to_strange_t_block = 5
}
}
这样只需使用以下内容即可访问链接:
ABlock* aBlock;
...
/* some stuff that initializes aBlock */
...
LINK linkToDBlock = aBlock->getLink(ABlock::link_to_d_block);
用户会看到有一个用于访问链接的枚举,他不需要知道索引或东西,而我不需要为每个派生块中的每个链接实现一个方法来获得自我解释的方式访问它们。
不幸的是,这不起作用,因为这些枚举不兼容。所以这样做我得到像
这样的东西“ABlock :: BlockLink”类型的参数与“BaseBlock :: BlockLink”类型的参数不兼容
那么,有没有一种优雅的方式做这样的事情?像“命名访问”或任何你称之为的东西?