2017-08-24 112 views
0

我有一個類,其中包含由vector< vector<Node> >實現的樹結構,其中Node包含一組通過getters/setter公開的屬性。使用成員函數打印對象

class Tree 
{ 
    vector< vector<Node> > mGrid; 
    printTree(std::ostream& output = std::cout); 
}; 

class Node 
{ 
    double property1 { return mProp1; } 
    double property2 { return mProp2; } 
}; 

printTree()目前硬財產使用TSTEP:

void Tree::printTree(ostream& output) 
{ 
    ... 
    for (unsigned t = 0; t < mGrid.size(); ++t) 
    { 
     toPrint = ""; 

     for (unsigned state = 0; state < mGrid[t].size(); ++state) 
     { 

     toPrint += to_string_with_precision(mGrid[t][state].tstep(), 1); 

     ... 

有一些華而不實/方便/面向對象推廣這一功能的方式,以便它可以打印出任何節點的屬性(而不僅僅是吐出硬連線的tstep()屬性,或者通過if/then語句實質上做同樣的事情)。

我做過的事情這在C中使用函數指針,但這是C++和C++常見問題解答說不要亂指向成員函數的指針。

+1

你真的想要什麼(我認爲)是「反射」 - 這還不是C++標準的一部分。 : - /這可能會讓你感興趣:https://meetingcpp.com/index.php/br/items/reflections-on-the-reflection-proposals.html –

+0

尋求調試幫助的問題(「爲什麼這段代碼不工作? 「)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建[mcve]。使用「編輯」鏈接來改善你的*問題* - 不要通過評論添加更多信息。謝謝! – GhostCat

回答

0

你可能想模板函數:

class Tree 
{ 
    vector< vector<Node> > mGrid; 
public: 
    template <typename F> 
    void ForEachNode(F&& f) { 
     int i = 0; 
     for (auto& v : mGrid) { 
      int j = 0; 
      for (auto& node : v) { 
       f(node, i, j); 
       ++j; 
      } 
      ++i; 
     } 
    } 
}; 

然後,你可以這樣做

void printTreeProp1(Tree& tree) { 
    tree.ForEachNode([](const Node& node, int i, int j) { 
     if (i != 0 && j == 0) { 
      std::cout << std::endl; 
     } 
     std::cout << node.property1() << " "; 
    }); 
} 
0

1日運你環路忽略的第一要素。 vector是基於零的,並且您正在使用++t++state,這會增加循環頂部的值。這意味着你永遠不會訪問第0個元素(mGrid[0]mGrid[t][0])。
第二,你沒有包括tstep()的定義,所以我們不知道你回來的是什麼。假設你想打印你的二維數組的每個維度,我認爲你必須打破它的立場。類似這樣的:

class Node 
{ 
protected: 
    double mProp1; 
    double mProp2; 

public: 
    double GetProp1(void) {return mProp1;} 
    double GetProp2(void) {return mProp2;} 
    String tStep(void) {return L"";} // add your code here 
}; 

class NodeRow : public std::vector<Node> 
{ 
public: 
    void Print(std::ostream& output) 
    { 
     iterator i; 
     String tStr; 

     for(i = begin(); i != end(); i++) 
      tStr += /*to_string_with_precision(*/i->tStep()/*, 1)*/; 
     output << tStr.c_str() << L"\r\n"; 
    } 
}; 

class Node2D : public std::vector<NodeRow> 
{ 
public: 
    void Print(std::ostream& output = std::cout) 
    { 
     iterator i; 

     for(i = begin(); i != end(); i++) 
      i->Print(output); 
    } 
}; 
+0

我不同意。控制變量在底部進行測試。使用前或後增量無關緊要。看到https://stackoverflow.com/questions/4706199/post-increment-and-pre-increment-within-a-for-loop-produce-same-output – Mathematician

+0

@Mathematician我說的是它第一次進入循環。當你到達'[]'運算符時,'t'和'state'的值是1而不是0.測試部分是正確的。你寫的代碼跳過了第0個元素。至少你應該使用't ++'和'state ++'。只要調試代碼,你會看到我在說什麼。 – Sam

+0

@Mathematician也要記住迭代器比索引好得多(更快)。 – Sam