【发布时间】:2013-12-25 10:40:06
【问题描述】:
考虑(注意从object 中删除的一些代码,即构造函数/析构函数和一些变量):
struct object {
virtual bool object_is_solid() = 0;
virtual bool object_is_visible() = 0;
virtual bool object_is_persistent() = 0;
virtual real_t object_depth() = 0;
virtual real_t object_sprite_index() = 0;
virtual real_t object_mask_index() = 0;
struct object_properties {
bool solid;
bool visible;
bool persistent;
real_t depth;
real_t sprite_index;
real_t mask_index;
real_t image_alpha;
real_t image_angle;
real_t image_blend;
real_t image_index;
real_t image_speed;
real_t image_xscale;
real_t image_yscale;
real_t hfriction;
real_t vfriction;
real_t hgravity;
real_t vgravity;
real_t hspeed;
real_t vspeed;
} properties;
void initialize_properties(object::object_properties& prop);
}
和
object::object(unsigned long id, real_t x, real_t y)
: id(id), xstart(x), ystart(y), x(x), y(y), xprevious(x), yprevious(y), properties{} {
this->initialize_properties(this->properties);
}
void object::initialize_properties(object::object_properties& prop) {
prop.solid = this->object_is_solid();
prop.visible = this->object_is_visible();
prop.persistent = this->object_is_persistent();
prop.depth = this->object_depth();
prop.sprite_index = this->object_sprite_index();
prop.mask_index = this->object_mask_index();
prop.image_alpha = 1;
prop.image_speed = 1;
prop.image_xscale = 1;
prop.image_yscale = 1;
}
注意initialize_properties的用法。
- 这还安全吗?如果我手动内联
initialize_properties,clang 拒绝编译它,因为它在构造函数中调用纯虚函数。 - 有没有比我现在做的更好的方法来初始化
properties?
【问题讨论】:
-
没关系。但是为什么
initialize_properties应该是inline?这是一个常见的实现细节 - 将其保存在翻译单元中。无论如何,架构有点尴尬,需要重新设计。在不知道您要达到的目标、示例以及为什么需要这些额外的bool成员的情况下 - 很难给出答案。 -
实际上,从我在this 线程中读到的内容来看,这是不安全的。我想我正在寻找替代品......
-
Haroogan:它们是可变的,仅在构造时设置为那种对象的“默认”值。
-
哦,你也在构造函数中调用它们——是的,你最好不要这样做。重新设计的另一个原因。
-
不,在构造函数中调用纯虚函数总是一个错误(它会崩溃),在构造函数中调用非纯虚函数几乎总是一个错误(它不会像大多数新手那样期待它这样做)。
标签: c++ virtual-functions