尝试将push_back转换为指向抽象类的向量

时间:2016-10-15 23:26:28

标签: c++ c++11

编译包含此类的代码:

<link href="css/app.css" rel="stylesheet">

产生错误:

  

[错误]没有匹配的调用功能   'std :: vector :: push_back(const Figures&amp;)const'

这是我应该在main()

中做的
class Dessin
{
    private:
        vector<Figures*>T;
    public:
        void ajouteFigure(const Figures& f) const
        {
            for(auto element: T)
            {
                T.push_back(f);
            }
        }
};

为什么这不起作用?

2 个答案:

答案 0 :(得分:5)

假设Cercle是一个类名,你试图推送一个指向预期值的值。

To&#34; fix&#34;您应该更改ajouteFigure原型以接受Figures指针和非常量this的错误:

void ajouteFigure(Figures* f) 

然后你应该调用它传递指向Figures对象的指针,即使用new表达式创建:

s.ajouteFigure(new Cercle(1.1));

话虽如此,这段代码似乎毫无意义。您添加指针的次数与向量中的元素一样多(在您提供的示例中始终为0)。

使用原始指针也是未经修改的,您应该使用像std::unique_ptr这样的智能指针,尽管这会破坏当前的代码。

考虑这个,不太不恰当的例子:

class Dessin
{
    private:
        vector<unique_ptr<Figures>> T;
    public:
        void ajouteFigure(unique_ptr<Figures> f)
        {
            T.push_back(move(f)); // just once
        }
};

并在通话现场:

Dessin s;
s.ajouteFigure(make_unique<Cercle>(1.1)); // C++≥14

或者,如果你不能使用C ++ 14:

Dessin s;
s.ajouteFigure(unique_ptr<Figures>(new Cercle{1.1}));

答案 1 :(得分:1)

为了补充一点,我认为最好将它作为模板函数,并在函数内创建正确的对象,并将参数传递给作为函数参数传递的构造函数。

这样,您每次调用此函数时都不必创建std::unique_ptr或使用new

这是一个基本的实现:

class Dessin{
    public:
        template<typename T, typename ... Args>
        void ajouteFigure(Args &&... args){
            figures.emplace_back(new T(std::forward<Args>(args)...));
        }

    private:
        std::vector<std::unique_ptr<Figures>> figures;
};

然后使用该类不易出错:

int main(){
    Dessin d;
    d.ajouteFigure<Cercle>(1.1);
}