返回复合模式的复合对象不会 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()中。您正在创建指向 nullptr
的 A*
类型的空对象。然后你要调用 myA
的成员函数,在这种情况下它什么都不指向,尝试正确初始化它,然后通过 myA
.
调用你的成员函数
我用 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()中。您正在创建指向 nullptr
的 A*
类型的空对象。然后你要调用 myA
的成员函数,在这种情况下它什么都不指向,尝试正确初始化它,然后通过 myA
.