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

Ami*_*ine 0 c++ c++11

编译包含此类的代码:

class Dessin
{
    private:
        vector<Figures*>T;
    public:
        void ajouteFigure(const Figures& f) const
        {
            for(auto element: T)
            {
                T.push_back(f);
            }
        }
};
Run Code Online (Sandbox Code Playgroud)

产生错误:

[错误]没有匹配函数调用'std :: vector :: push_back(const Figures&)const'

这是我应该在main()中做的事情

Dessin s;
s.ajouteFigure(Cercle(1.1));
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

krz*_*zaq 5

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

要"修复"错误,您应该更改ajouteFigure原型以接受Figures指针和非const this:

void ajouteFigure(Figures* f) 
Run Code Online (Sandbox Code Playgroud)

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

s.ajouteFigure(new Cercle(1.1));
Run Code Online (Sandbox Code Playgroud)

话虽这么说,这段代码似乎毫无意义.您添加指针的次数与向量中的元素一样多(在您提供的示例中始终为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
        }
};
Run Code Online (Sandbox Code Playgroud)

并在通话现场:

Dessin s;
s.ajouteFigure(make_unique<Cercle>(1.1)); // C++?14
Run Code Online (Sandbox Code Playgroud)

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

Dessin s;
s.ajouteFigure(unique_ptr<Figures>(new Cercle{1.1}));
Run Code Online (Sandbox Code Playgroud)