我有2d vector 与对象
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++
最佳答案
new
运算符创建一个指向perceptron
实例的指针,因此编译器错误是正确的(perceptron*
!= perceptron
)。
幸运的是,创建 vector 时,该 vector 已经预先创建了所有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
,shared_ptr
,raw指针等)。但是,除非您确实需要将代码与C#的功能匹配,否则,通过避免指针开销(例如,取消引用),您的代码可能会比原始方法更快(并且更易于使用)。