2016-11-24 15 views
1

に私はオブジェクトと2Dベクトルを持ってどのように今2Dベクトルへの割当対象事業者のための一致なし=

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

私はこの

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); 
} 

のようなオブジェクトperceptronを割り当てたいしかし、私はエラーを取得します

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(); 
        ^

どうすれば修復できますか?

EDIT:

私はこのコードが正常に動作しますC#では

Perceptron[] p; 

p = new Perceptron[10]; 

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

だったのC#のコードをモデルにしました。 コンパイラエラーが正しいですので、それは、C++

答えて

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; 
} 

EDIT:あなたの更新の質問のために(つまり、どのように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_ptrshared_ptr、生ポインタなど)。

もつとも、あなた本当には、あなたが(例えば逆参照)ポインタのオーバーヘッドを回避することにより、本来はそれをやった方法#が何をC、あなたのコードは、おそらくも速い(で使いやすい)になりますようにコードを一致させる必要がない限り、 。

+0

回答ありがとうございました。質問があります。更新された質問を見ることができますか? – lukassz

+0

@Lukassz - C++とC#の間でより近似したコードを望むなら、 'perceptron'オブジェクトへの(スマートな)ポインタのベクトルを格納する必要があります。 C#はこれを内部的に行い、C++のポインター構文を使用する必要はありません。私は答えを例で更新しました。 –

+0

@lukassz C++!= C#。アイデアのフレームワーク/ソースとしてC#を使用しますが、どのようにメモリを管理するのかを複製しようとはしません。C#は無限のメモリシミュレータ、ガベージコレクタをベースにしていますが、C++はメモリとリソースの厳格で個人的な制御に基づいています。カールのアドバイスを受けて、オプション1に行く。必要なときにのみ動的に割り当てます。 – user4581301

0

new perceptron()percepteronへのポインタを返します。 perceptronオブジェクトを個別にヒープに割り当てたい場合は、pvector<vector<pecepteron *>>(または、より適切なスマートポインタpercepteron)に変更する必要があります。個々のヒープ割り当てが重要でなく、percepteronに許容される初期化を行うデフォルトのコンストラクタがある場合、この割り当てはまったく必要ありません。個々のvector<percepteron>オブジェクトの割り当てはすでにこのコンストラクタを実行しています。

関連する問題