我有一个包含由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 ++常见问题解答说不要乱用指向成员函数的指针。
答案 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);
}
};