【发布时间】: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)。 -
是的,我正在努力,我错过了一些基础知识。但是,我仍然不明白为什么我所做的其他实现工作,只是它们返回的对象的非复合性质不同