2013-02-01 83 views
1

我有一個具有向量作爲類成員的對象數組(實際上它是一個結構體)。該結構是:將矢量作爲類成員的對象數組

struct Cell { 
    vector<int> borderNodes; 
    vector<int> helperNodes; 

    int minNodePointer; 
    int maxNodePointer; 


    Cell() { 
    minNodePointer = -1; 
    maxNodePointer = -1; 
    } 

    Cell(int _minNodePointer, int _maxNodePointer) { 
    minNodePointer = _minNodePointer; 
    maxNodePointer = _maxNodePointer; 
    } 

    vector<int>& getHelperNodes() { 
    return helperNodes; 
    } 

    vector<int>& getBorderNodes() { 
    return borderNodes; 
    } 

    void setHelperNodesArray() { 
    sort(helperNodes.begin(), helperNodes.end()); 
    } 

    void setBorderNodesArray() { 
    sort(borderNodes.begin(), borderNodes.end()); 
    } 
}; 

我已經建立這些對象的數組作爲一個全局變量有:

Cell* cells = new Cell[maxNumberOfCells]; 

,我想一些整數添加到該對象中的載體。

我想這(函數內部):

cells[cellId].borderNodes.push_back(node_id); 

cells[cellId].getBorderNodes().push_back(node_id); 

,他們編譯罰款,但沒有被添加到載體。如何正確的方法來做到這一點?這是從數據庫讀取的函數,並添加整數。查詢和從數據庫讀取是正確的,所以沒有錯誤。

void loadBorderNodesPerCellBnOnly(bool shouldRearrangeNodes, int subtractor, int maxNumberOfCells, int** cellBorderNodes) { 
    cellBorderNodes = new int*[maxNumberOfCells]; 
    try { 
     work W(Conn); 
     for (int rownum = 0; rownum < r.size(); ++rownum) { 
      const result::tuple row = r[rownum]; 

      vector<string> s = split(row[1].as<string >(), ' '); 
      const int mySize = s.size(); 
      int cellId = row[0].as<int>(); 
      cellBorderNodes[cellId] = new int[mySize]; 
      for (int k = 0; k < mySize; k++) { 
       int node_id = atoi(s[k].c_str()); 
       cellBorderNodes[cellId][k] = node_id; 
       (cells[cellId].getBorderNodes()).push_back(node_id); 
       try { 
        nodes[node_id - subtractor].cellId = cellId; 
       } catch (const std::exception &e) { 
        std::cerr << e.what() << std::endl; 
       } 
       nodes[node_id - subtractor].isBorderNode = true; 
      } 
      s.clear(); 
     } 
    } catch (const std::exception &e) { 
     std::cerr << e.what() << std::endl; 
    } 


    for (int k = 0; k < maxNumberOfCells; k++) { 
     cout << k << ": " << cells[k].borderNodes.size() << endl; 
     cells[k].setBorderNodesArray(); 
     if (maxBorderNodesPerCell < cells[k].borderNodes.size()) { 
      maxBorderNodesPerCell = cells[k].borderNodes.size(); 
     } 
    } 
} 
+8

你怎麼確定沒有添加任何東西? –

+2

你怎麼知道什麼都沒有添加?對於(int k = 0; k

+0

(cout << k <<「:」<< cells [k] .borderNodes.size()<< endl; } – Alexandros

回答

2
void loadBorderNodesPerCellBnOnly([...], int** cellBorderNodes) { 
    cellBorderNodes = new int*[maxNumberOfCells]; 

功能通過上述值取一個int**。該函數內部的副本名爲cellBorderNodes。在下一行中,您更改副本的值並繼續更新。這些更改都不會在函數外部可見。 (並且您將泄漏獲取的內存)

如果您想通過int**並在函數內修改它,請考慮按照int**&中的引用傳遞它。但你可能會更好使用更高級別的構造(通過vector<vector<int>>&,創建一個代表數據的類型並按值傳遞......)

+0

你是對的,但我的問題是不與cellBorderNodes,與單元格數組。我會解決它,但我的問題仍然存在 – Alexandros

+0

問題是用於分割字符串在分貝中的分隔符。所以現在我的代碼工作。謝謝大家的幫助 – Alexandros