【问题标题】:Returning Composite object of composite pattern doesn't return the whole object返回复合模式的复合对象不会返回整个对象
【发布时间】:2020-06-11 21:56:03
【问题描述】:

我创建了一个包含组件、叶子和复合类的复合模式,其中只有复合类同时具有成员变量向量和添加方法:

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

在一个单独的类 B 中,我创建了一个方法 getComponent() 来返回一个 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 不是同一个对象。我认为退货的方式有问题吗?

这是我的另一种方式,在阅读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 对象(而不是 Composite 对象)的类似设计有效,我想知道我在使用复合材料的方式上是否可能有问题,而不是在我返回成员变量的方式上。 .我的意思是,我通过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 中,本质上是在null_ptr 上调用成员函数。
  • 在看了这个之后,您似乎需要了解 C++ 和指针。具体来说,我建议了解[new]https://en.cppreference.com/w/cpp/keyword/new) 及其相关关键字(如delete)。
  • 是的,我正在努力,我错过了一些基础知识。但是,我仍然不明白为什么我所做的其他实现工作,只是它们返回的对象的非复合性质不同

标签: c++ vector composite


【解决方案1】:

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

【讨论】:

  • 谢谢萨吉斯。我认为,由于 m_Comp 是 A 的成员变量,它不会超出范围。我知道我必须做一些基本的事情
  • 你以Component * getComponent() 的形式返回Composite m_Comp; 也许这就是问题所在?
  • 这是我的错误对不起!
  • 我试过了,我用 Composite 替换了 Component(并更新了我的问题的文本),但是这两个对象仍然不同......
  • 感谢 Sargis,我修改了代码,B 是由抽象类 A 派生的 Class。新版本与您的观察是否正确?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
相关资源
最近更新 更多