我想先显示一些代码,稍后再解释我的问题。
基类:
class swcObject :
public swcRectangle
{
public:
bool visible;
};
子基类[可选,抽象]:
class swcText
{
public:
std::string text;
protected:
virtual void attachedToParent() = 0;
};
派生类:
class swcLabel :
public swcObject,
public swcText
{
public:
int text_align;
private:
void attachedToParent();
};
...
class swcComboBox :
virtual protected swcObject
{
public:
void setPosition(int x, int y);
private:
swcLabel label;
};
现在我有了w / c这个类,它的成员对象的类型为
std::vector<swcObject>
。class swcWindow :
private swcObject
{
public:
void addObject(const swcObject &object);
private:
std::vector<swcObject> objects;
};
我遇到了之前从未遇到过的w / c这几个问题,Google似乎没有像我这样的相关问题。
我的具体问题是:
相关代码:
swcWindow window;
swcComboBox cbox;
window.addObject(cbox);
错误:
'swcObject'是'swcComboBox'不可访问的基础
欲望:
我不想访问像
swcComboBox::swcObject
这样的公共范围内的cbox.x = 0;
成员,而是访问cbox.setPosition(0, 0);
,因为每当swcComboBox
更改其位置时,总会对某些成员元素进行调整。相关代码:
swcWindow window;
swcLabel label;
window.addObject(label);
错误:
在这种情况下,
label
具有swcText
和swcObject
的基类。将label
添加到window.objects
成员之一(类型为std :: vector)后,swcText
属性消失了,就像text
属性一样。欲望:
我想创建一个临时对象,并在这些类之外的
init()
方法中初始化其属性,然后使用swcWindow::addObject()
复制它。没有演员就可以吗?我认为这会做,但它的效果很糟糕(?),如果可行,我还没有尝试过:void addObject(const swcObject &object, SWC_TYPES type)
{
switch (type)
{
case LABEL:
//do casting?
...
}
}
请推荐任何其他方式来实现相同功能的实现。
最佳答案
向量按值存储元素,就好像您将ComboBox传递给了按值而不是按引用获取swcObject的过程一样。这导致将对象削减为其基类,如果使用受保护的继承,则将其禁止。
您不应该将多态对象存储在vector中,就像您不应该按值传递它们一样。您可以尝试将引用或(智能)指针存储在vector中-这样可以解决您的问题。