从包含不同对象的向量,如何调用正确的函数?

时间:2016-12-18 04:14:29

标签: c++

我有像......这样的课程。

class BaseNode { 
    // ...

    public:
        virtual void save(std::ofstream &);
};

class InputNode : public BaseNode { ... } // no virtual save
class BiasNode : public BaseNode { ... } // no virtual save

我将它们存储在这个载体上......

std::vector<std::shared_ptr<BaseNode>> nodes;

nodes.push_back(make_shared<BaseNode>(InputNode()));
nodes.push_back(make_shared<BaseNode>(BiasNode()));

但以下不起作用......

for (auto n = nodes.begin(); n != nodes.end(); ++n) 
    n->save(outfile);

../../../../src/libs/ann/base-net.cpp:40:6: error: ‘class std::shared_ptr<BaseNode>’ has no member named ‘save’

然而BaseNode确实有一个save()函数,我觉得我在迭代中做错了。

我确实有从BaseNode继承的其他类包含它们自己的虚拟保存函数,但在这种情况下(其中InputNode和BiasNode没有定义它们自己的)我希望InputNode和BiasNode调用BaseNode :: save()。

思想?

4 个答案:

答案 0 :(得分:3)

nodes.begin()返回一个迭代器,因此您需要取消引用迭代器才能到达该对象。

for (auto n = nodes.begin(); n != nodes.end(); ++n)
    (*n)->save(outfile);

Live Example

也只是一个提示:将参数设为save一个std::ostream&。如果输出流不是文件,这会使save函数更具灵活性。

答案 1 :(得分:1)

你应该取消引用迭代器。

有两种方法可以解决您的问题:最简单的方法是:

for (auto n: nodes) 
      n->save(outfile);

另一种方法是将迭代器转换为对向量元素的引用(指向对象的指针):

for (auto n = nodes.begin(); n != nodes.end(); ++n) {
   auto &el = *n;
   el->save(outfile);
}

但是,为什么要存储指针?为什么不简单地将对象存储在向量中?

std::vector<BaseNode> nodes;
nodes.push_back(BiasNode());
nodes.push_back(InputNode());

for (auto n: nodes) 
   n.save();

答案 2 :(得分:0)

for (auto n = nodes.begin(); n != nodes.end(); ++n) 
    n->save(outfile); //here's the issue

这里,n是迭代器。取消引用它就像这样使用:

(*n)->save(outfile);

或者简单地说(在C ++ 11之后)

for (auto n : nodes) 
    n->save(outfile);

答案 3 :(得分:-1)

您可以使用:

TYPE& dynamic_cast<TYPE&> (object);

要尝试找出你在循环中调用的类,然后调用你希望拥有它的类的方法。