如何将对象分配给2d向量不匹配operator =

时间:2016-11-24 00:30:08

标签: c++ vector

我有2d矢量对象

std::vector<std::vector<perceptron>> p;

现在我想像这样分配对象perceptron

PrintRectangle::PrintRectangle(QWidget *parent) : QWidget(parent),
    p(5, std::vector<perceptron>(5))
{

    tech = new teacher(clicked);


    for(int i=0; i<5; i++)
    {
        for(int j=0; j<5; j++)
        {
            p[i][j] = new perceptron();
            p[i][j].randweight();
        }
    }

    double learnConst = 0.1;
    //tech->learnPerceptrons(p);
}

但是我收到了错误

E:\Sieci Neuronowe\Perceptron\printrectangle.cpp:16: error: no match for 'operator=' (operand types are '__gnu_cxx::__alloc_traits<std::allocator<perceptron> >::value_type {aka perceptron}' and 'perceptron*')
             p[i][j] = new perceptron();
                     ^

我该如何修复?

编辑:

我模仿了C#的代码

Perceptron[] p;

 p = new Perceptron[10];

 for (int i = 0; i < 10;i++)
 {
      p[i] = new Perceptron();
      p[i].randweight();
 }

在C#中,这段代码运行正常。 它如何适合C ++

2 个答案:

答案 0 :(得分:4)

new运算符为perceptron的实例创建指针,因此编译错误正确(perceptron*!= perceptron

幸运的是,在您创建向量时,向量已经预先创建了所有perceptron个实例,因此您只需删除相关的行。

PrintRectangle::PrintRectangle(QWidget *parent) : QWidget(parent),
    p(5, std::vector<perceptron>(5))  // <----------- 25 perceptron objects created here!
{

    tech = new teacher(clicked);


    for(int i=0; i<5; i++)
    {
        for(int j=0; j<5; j++)
        {
            // p[i][j] = new perceptron(); NO NEED FOR THIS LINE
            p[i][j].randweight();
        }
    }

    double learnConst = 0.1;
}

编辑:对于您更新的问题(即如何使C ++代码与C#代码匹配),您可以使用智能指针来存储perceptron个对象:

PrintRectangle::PrintRectangle(QWidget *parent) : QWidget(parent),
    p(5, std::vector<std::unique_ptr<perceptron>>(5))
{

    tech = new teacher(clicked);


    for(int i=0; i<5; i++)
    {
        for(int j=0; j<5; j++)
        {
            p[i][j].reset(new perceptron)
            p[i][j]->randweight();
        }
    }

    double learnConst = 0.1;
}

我在这里选择unique_ptr来保存perceptron指针,但是您应该确定您的所有权要求是什么,并根据您的需要选择最佳指针类型(例如unique_ptr,{{ 1}},原始指针等)。

HOWEVER ,除非你真的需要将代码与C#相匹配,否则你的代码可能会更快(更容易使用)最初通过避免指针开销(例如解除引用)。

答案 1 :(得分:0)

percepteron返回指向perceptron的指针。如果您希望p个对象分别进行堆分配,则需要将vector<vector<pecepteron *>>更改为percepteron(或更好,指向percepteron的适当智能指针)。如果单个堆分配不重要,并且vector<percepteron>有一个执行可接受初始化的默认构造函数,那么根本不需要这个赋值 - 单个INSERT into phone_numbers(id, number) VALUE (null, CONCAT('61', SUBSTR('0455000000', 2))) 对象的分配已经运行这个构造函数。