【发布时间】:2018-05-28 12:48:52
【问题描述】:
我有两个类,大致定义如下:
class Inner {
public:
bool is_first;
};
class Outer {
public:
char some_other_member;
Inner first;
Inner second;
}
我知道Inners 只存在于Outers 中,并且当且仅当相应的对象是first 成员而不是@987654327 时,相应的布尔标志才会设置为true @。
我正在寻找一种符合标准的方法来派生指向包含一些 Inner 对象的 Outer 对象的指针。当然,我可以在每个 Inner 对象中存储一个指针,但由于 Inner 类非常小,而且我有 很多 它们,这似乎是浪费内存(因此很宝贵缓存)。
显然,编译器应该知道first、second 和包含Outer 对象之间的内存偏移量。问题是:是否有一种符合标准的方式告诉编译器“获取该偏移量,从指向Inner 的指针中减去它并使其成为Outer 指针”?
我知道如果Outer 将包含Inners 作为基本子对象(例如this),我可以使用转换为void - 我非常认为成员子对象应该可以进行类似的操作?
【问题讨论】:
-
如果只有
first或second将同时有效,为什么会有两个成员呢?导致这样设计的真实和实际问题是什么?不能通过继承和多态来解决吗? -
不,两者同时有效。两个内部对象实际上是两个红黑树节点,代表一个区间的开始和结束(也就是外部类)。问题是:他们知道他们是
first还是second。 -
我希望您建议您应该开始 C++ 编程。像你计划的那样做指针算术是不好的做法。你没有计算指针,你也改变了类型。从 OOP 的角度来看,您将课堂上的所有知识都放在外面的“某物”中。为什么不简单地从指向成员的实例返回一个指针呢?这将保留类型并将所有信息保留在内部。顺便说一句:为什么你需要一个外部!指向对象内部的指针。所有这些都是糟糕的设计!
-
@LukasBarth:我相信你走错了路!如果您相信,手动减去指针会比返回指向子对象的指针更聪明,那么您就错了。如果您返回一个指向子对象的指针,编译器将简单地创建一个方法,将已知的常量偏移量添加到 this 指针。正是你需要的。所以我不明白你的好处是什么。首先尝试使用 OOP 设计在 c++ 中对其进行编码。如果遇到性能问题,请转到生成的程序集。如果您相信,您的手工代码可以更好,您可以选择优化。
-
@LukasBarth:问题始于一般设计:为什么您需要为存储在已知元素中的东西设置标志。它作为第一个或第二个元素存储的知识已经可用。接下来是,你有一个对象,它只能在另一个对象中存活,但你想处理指向内部对象的指针。所有这一切都让我觉得有一些逻辑颠倒。也许重新考虑潜在问题是一个想法?