从嵌套对象访问外部对象 关于C++标准和适当设计模式< /P>的问题

从嵌套对象访问外部对象 关于C++标准和适当设计模式< /P>的问题,c++,design-patterns,C++,Design Patterns,我有一个对象,它有几个非POD对象作为成员,我需要从这些对象内部访问外部对象 例如,它可以是一个“侦听”多个不同事件的对象,而侦听意味着实现一些接口。您不能直接通过主类继承这个接口,因为您不能多次继承同一个基类。但是,即使您可以-您可能希望避免这种情况,因为您不想公开此接口,它只是对象的实现细节 我的意思是这样的: class MyClass { // ... struct Listener1 :public IEventListener { virtual vo

我有一个对象,它有几个非POD对象作为成员,我需要从这些对象内部访问外部对象

例如,它可以是一个“侦听”多个不同事件的对象,而侦听意味着实现一些接口。您不能直接通过主类继承这个接口,因为您不能多次继承同一个基类。但是,即使您可以-您可能希望避免这种情况,因为您不想公开此接口,它只是对象的实现细节

我的意思是这样的:

class MyClass
{
    // ...
    struct Listener1 :public IEventListener {
        virtual void OnEvent() { /* need to access MyClass */ }
    } m_Evt1;

    struct Listener2 :public IEventListener {
        virtual void OnEvent() { /* need to access MyClass */ }
    } m_Evt2;
};
访问外部类的一个明显方法是在每个内部对象中都有一个指向它的指针/引用成员。但这需要编写一些代码(指针/引用的初始化),并且编译器不喜欢在基本成员初始化中使用
this
,另外还有为此生成的实际代码,并且对象布局在内存中膨胀

还有另一种可能性:使用类似于
的技巧的
偏移。内部对象wrt外部类的内存偏移量在编译时已知。因此,反之亦然,也就是说,我们可以从内部对象的偏移量中减去该偏移量,得到指向外部类的指针。用好的C++访问器和-VoILA.

来包装它。
#define IMPLEMENT_GET_PARENT_OBJ(parent_class, this_var) \
parent_class& get_ParentObj() { return * (parent_class*) (((PBYTE) this) + 1 - (PBYTE) (&((parent_class*) 1)->this_var)); }

class MyClass
{
    // ...
    struct Listener1 :public IEventListener {
        IMPLEMENT_GET_PARENT_OBJ(MyClass, m_Evt1)
        virtual void OnEvent() { get_ParentObj().OnEvent1(); }
    } m_Evt1;

    struct Listener2 :public IEventListener {
        IMPLEMENT_GET_PARENT_OBJ(MyClass, m_Evt2)
        virtual void OnEvent() { get_ParentObj().OnEvent2(); }
    } m_Evt2;

    void OnEvent1();
    void OnEvent2();
};
有人可能会争辩说,如果您在
MyClass
之外声明此类内部类型的对象,那么显然
get\u ParentObj()
被破坏了,您将获得未定义的行为。另外,从技术上讲,您可以从内部类的c'tor获取对外部类的引用,甚至在构建外部类之前就调用其方法

我知道有无数种方法可以解决这个问题,并使其简单易懂,比如动态创建内部对象,并给它们一个对外部类的弱引用,等等。 但在我的场景中,这是一种过度的杀伤力。假设你不是故意朝自己的脚开枪,那似乎没有问题。实际上,它工作正常,没有任何内存浪费或不必要的额外代码

这被认为是一种好的做法吗?如果不是,为什么