2016-11-24 38 views
1

我有一個目標2D矢量如何分配對象爲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++

回答

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_ptrshared_ptr,生指針,等等)。

無論其,除非你真的需要的代碼相匹配呢,你的代碼是什麼C#可能會更快(和更容易使用),你做到了最初通過避免指針開銷的方式(如提領) 。

+0

好,對答案,謝謝,我有一個問題。你能看看我更新的問題嗎? – lukassz

+0

@Lukassz - 如果你℃之間++和C#想更匹配的代碼,你需要的(智能)指針矢量存儲'perceptron'對象。 C#在內部執行此操作,並且不要求您使用C++指針語法。我用一個例子更新了我的答案。 –

+0

@lukassz C++!= C#。使用C#作爲框架/思想來源,但不要試圖重複它如何管理內存。C#基於無限的內存模擬器,垃圾收集器,而C++基於對內存和資源的嚴格和個人控制。採取卡爾的建議,並選擇一個。只有在必要時才動態分配。 – user4581301

0

new perceptron()返回一個指向percepteron。如果你想單獨堆中分配的perceptron對象,那麼你需要改變pvector<vector<pecepteron *>>(或更好的,適當的智能指針percepteron)。如果個別堆分配並不重要,percepteron有一個默認的構造函數,做可接受的初始化,那麼你不需要這個任務在所有 - 個人vector<percepteron>對象的分配將已經運行此構造函數。