使用成员函数打印对象

时间:2017-08-24 18:15:42

标签: c++ oop

我有一个包含由vector< vector< Node > >实现的树结构的类,其中Node包含通过getter / 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 );

         ...

是否有一些灵活/方便/面向对象的方式来推广这个函数,以便它可以打印出任何Node的属性(而不是仅吐出硬连线的tstep()属性或者基本上通过if / then执行相同的操作语句)。

我在C语言中使用函数指针完成了这样的事情,但这是C ++,C ++常见问题解答说不要乱用指向成员函数的指针。

2 个答案:

答案 0 :(得分: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() << " ";
    });
}

答案 1 :(得分:0)

第1个操作所有循环都忽略了第一个元素。 vector基于零,您使用的是++t++state,它会增加循环顶部的值。这意味着你永远不会访问第0个元素(mGrid[0]mGrid[t][0])。第2,你确实包括了tstep()的定义,所以我们不知道你是什么回来了。假设你要打印2维数组的每个维度,我认为你必须打破它的和平。像这样:

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