gpt4 book ai didi

c++ - 如何在不在基类中的派生类中访问 STL 类的成员函数? (正文有详细解释)

转载 作者:行者123 更新时间:2023-11-27 23:37:14 24 4
gpt4 key购买 nike

现在我有一个基类,Base{} 类,从它派生了两个类,BFS{} 和 DFS{}。 BFS有queue,而DFS有stack,所以它们都有一个叫“nodes”的成员,但类型是它们各自的std::queue和std::stack。我的搜索函数将指向基类的指针作为其参数,以便它可以接受两个派生类,并通过从派生类内部的成员类中推送和弹出来运行搜索(按照通常的 DFS BFS 算法)。问题是,因为我将基类作为参数传入,所以每当我尝试从派生类调用名为“节点”的成员堆栈/队列上的推送或弹出时,它总是说推送/弹出无法完成,因为基类中没有称为“节点”的成员。我应该如何进行这项工作?此外,此设置是我正在执行的任务的要求,我只是无法弄清楚它应该如何工作,我们将不胜感激。谢谢!

class Base {
public:
virtual void push(uint64_t roomID, float intensity, int distance) = 0;
virtual Node pop(void) = 0;
virtual int size(void) = 0;
};

class Breadth : public Base {
public:
std::queue<std::pair<uint64_t, int>> U;
void push(uint64_t roomID, float intensity, int distance) { std::pair<uint64_t, int> p(roomID, distance); U.push(p); }
Node pop() { Node rr; rr.ID = U.front().first; rr.distance = U.front().second; U.pop(); return rr; }
int size() { return U.size(); }
};

class Depth : public Base {
public:
std::stack<std::pair<uint64_t, int>> U;
void push(uint64_t roomID, float intensity, int distance) { std::pair<uint64_t, int> p(roomID, distance); U.push(p); }
UnexploredRoom pop() { U.pop(); }
int size() { U.size(); }
};

void robotSearch::searchLoop(Base* search, Discovered* D, uint64_t roomID)
{
Node room;
room.ID = roomID;
room.distance = 0;
search->U.push(room); //problem here, compiler wont let me push U
...
}

最佳答案

要通过指向基类的指针实现自定义行为,您需要使用virtual functions。 .另一种方法是使用带有模板的通用代码。

例子:

class Base {
public:
virtual ~Base() {}
virtual void push(int i) = 0;
virtual int pop() = 0;
};

class DFS : public Base{
public:
virtual void push(int i) override { /*...*/ }
virtual int pop() override { /*...*/ return {}; }
};

class BFS : public Base {
public:
virtual void push(int i) override { /*...*/ }
virtual int pop() override { /*...*/ return {}; }
};

关于c++ - 如何在不在基类中的派生类中访问 STL 类的成员函数? (正文有详细解释),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58405435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com