返回复合模式的复合对象不会 return 整个对象

Returning Composite object of composite pattern doesn't return the whole object

我用 Component、Leaf 和 Composite Classes 创建了一个复合模式,其中只有 Composite Class 同时具有成员变量向量和 add 方法:

void add(Component *a);
vector < Component * > children;

在一个单独的 class B 中,我创建了一个方法 getComponent() 到 return 一个 Composite 成员变量

Class B: public A
{
    Composite m_Comp;
    public:
    Composite * getComponent() 
    {
        Leaf myLeaf1;
        Leaf myLeaf2;
        Composite myComp1;
        myComp1.add(&Leaf1)
        myComp1.add(&Leaf2)
        Leaf myLeaf3;
        m_Comp.add(&myComp1);
        m_Comp.add(&myLeaf3);

        m_Comp.inspect()   

        return &m_Comp;
    }
};

当我检查 mypCompCheck 时它看起来是正确的,但是当我从 main 中检索它时 (?):

A* myA;
AuxClass myAuxObject;
myA=myAuxObject.returnReferenceToClassBObject();
Composite * mypComp=myA->getComponent(); 
mypComp->inspect()   

mypComp 不是同一个对象。是不是我想的方法不对return呢?

这是我的替代方法,在阅读 Is returning references of member variables bad practice? 之后,但仍然无法正常工作...

Class B: public A
    {
    public:        
        Composite m_Comp;
        setComponent() 
        {
            Leaf myLeaf1;
            Leaf myLeaf2;
            Composite myComp1;
            myComp1.add(&Leaf1)
            myComp1.add(&Leaf2)
            Leaf myLeaf3;
            m_Comp.add(&myComp1);
            m_Comp.add(&myLeaf3);
            m_Comp.inspect();
        }
    };

主要

A* myA;
AuxClass myAuxObject;
myA=myAuxObject.returnReferenceToClassBObject();
myA=myAuxObject.m_Comp.inspect();

当我在 get 方法中检查对象时,它正确显示了它的所有组件,包括嵌套组件。当我在 main 中执行此操作时,我将 m_Comp 中的 myComp1 视为组件而不是复合。

正因为如此,并且因为与 std 对象(而不是复合对象)的类似设计有效,我想知道我使用复合对象的方式是否有问题,而不是我的方式 returning 成员变量...我的意思是,我通过 add 方法通过引用添加这些组件,然后它们的范围受到限制?

因此,我用成员变量替换了所有的局部变量,并且有效...

Class A
    {
        Leaf m_Leaf1;
        Leaf m_Leaf2;
        Composite myComp1;
        Leaf myLeaf3;

        public:
        Composite m_Comp;
        setComponent();
       {
            m_Comp1.add(&m_Leaf1)
            m_Comp1.add(&m_Leaf2)
            m_Comp.add(&m_Comp1);
            m_Comp.add(&m_Leaf3);
            m_Comp.inspect();
       }
};

并在主要部分

A myA;
myA.m_Comp.inspect();

感谢您的提示和相关搜索,我得到了一些富有成果的学习。

你的问题出现在main()中。您正在创建指向 nullptrA* 类型的空对象。然后你要调用 myA 的成员函数,在这种情况下它什么都不指向,尝试正确初始化它,然后通过 myA.

调用你的成员函数