【发布时间】:2019-10-30 19:39:02
【问题描述】:
我需要实现很多具有不同 const 成员数据的派生类。数据处理应该在基类中处理,但我找不到访问派生数据的优雅方法。下面的代码可以运行,但我真的不喜欢它。
代码需要在小型嵌入式环境中运行,因此无法广泛使用堆或 Boost 等花哨的库。
class Base
{
public:
struct SomeInfo
{
const char *name;
const f32_t value;
};
void iterateInfo()
{
// I would love to just write
// for(const auto& info : c_myInfo) {...}
u8_t len = 0;
const auto *returnedInfo = getDerivedInfo(len);
for (int i = 0; i < len; i++)
{
DPRINTF("Name: %s - Value: %f \n", returnedInfo[i].name, returnedInfo[i].value);
}
}
virtual const SomeInfo* getDerivedInfo(u8_t &length) = 0;
};
class DerivedA : public Base
{
public:
const SomeInfo c_myInfo[2] { {"NameA1", 1.1f}, {"NameA2", 1.2f} };
virtual const SomeInfo* getDerivedInfo(u8_t &length) override
{
// Duplicated code in every derived implementation....
length = sizeof(c_myInfo) / sizeof(c_myInfo[0]);
return c_myInfo;
}
};
class DerivedB : public Base
{
public:
const SomeInfo c_myInfo[3] { {"NameB1", 2.1f}, {"NameB2", 2.2f}, {"NameB2", 2.3f} };
virtual const SomeInfo *getDerivedInfo(u8_t &length) override
{
// Duplicated code in every derived implementation....
length = sizeof(c_myInfo) / sizeof(c_myInfo[0]);
return c_myInfo;
}
};
DerivedA instanceA;
DerivedB instanceB;
instanceA.iterateInfo();
instanceB.iterateInfo();
【问题讨论】:
-
不,我只实例化派生类。
-
@NikosC.Base 是抽象的,不能创建它的实例。
-
如果
SomeInfo c_myInfo[3]是const并且有一个编译时常量初始化器,为什么你把它放在对象里面而不是static?您是否只为每种类型创建一个实例,所以实际上没有重复指针 + 浮点数? (如果您将字符串键/值数组用作字典,它的效率听起来也不是很好,但这是一个单独的问题。听起来像是enum.. 的工作) -
感谢所有建议!到目前为止,Nikos C. answer 最适合我的需要,尽管 Peter Cordes 的方法也很简洁。只是一些澄清:1)一些用户建议将 c_myInfo 设为静态常量,他们当然是正确的。 2)我的嵌入式环境不是那么小,我必须计算每一位和字节。如果可以避免的话,我只是不想在库上编译一些额外的 10 kB。可读性比代码效率更重要。
标签: c++ c++11 inheritance