【问题标题】:Trying to push_back into a vector pointing to an abstract class试图将 push_back 放入指向抽象类的向量中
【发布时间】:2016-10-15 23:26:27
【问题描述】:

编译包含此类的代码:

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

产生错误:

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

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

Dessin s;
s.ajouteFigure(Cercle(1.1));

为什么这不起作用?

【问题讨论】:

  • @AlexD 虽然从骨子里就有缺陷。
  • 不要将原始指针存储在 std::vector 中 - 请改用 std::vector&lt;std::unique_ptr&lt;Figure&gt;&gt;
  • @AlexD 我试过了,它不起作用。同样的错误
  • @AlexD 这行得通,谢谢。我可以知道具体原因吗?
  • 这段代码太破了,没有答案可以帮助你。

标签: c++ c++11


【解决方案1】:

假设Cercle 是一个类名,您正在尝试将一个值推送到需要指针的位置。

要“修复”错误,您应该将 ajouteFigure 原型更改为接受 Figures 指针和非 const 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}));

【讨论】:

  • 这个问题被标记为 c++11,你可能应该提供std::make_unique 的替代方案,以防 OP 尚未使用 c++14。
  • @ArchbishopOfBanterbury 添加。
【解决方案2】:

除此之外,我认为您最好将其设为模板函数并在函数内部创建正确的对象,并将参数作为函数参数传递给构造函数。

这样您不必在每次调用函数时都创建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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多