我想先显示一些代码,稍后再解释我的问题。

基类:

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具有swcTextswcObject的基类。将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中-这样可以解决您的问题。

10-04 11:07