0

我需要在 c++ 的类中添加一些方法。我正在使用名为“Super_list”的继承创建一个新类,它将继承列表的所有方法并允许我添加自己的方法。

#ifndef SUPER_LIST_H
#define SUPER_LIST_H

#include "my_containter.h"
#include <list>
using namespace std;

class My_Container;

class Super_list: public list<My_Container>
{
 public:
  void new_func1();
  void new_func2();
  void new_func_3();
};
#endif

这是我正在使用我新制作的课程的地方:

#ifndef my_container_H
#define my_container_H

#include <list> 
#include "super_list.h"
using namespace std;

class Super_list;

class My_container
{
 private:
  Super_list buddy;
};
#endif

我收到一堆与未正确完成继承有关的错误。我将不胜感激完成此任务的任何帮助或其他想法。

谢谢 :)

4

3 回答 3

2

你有一个循环依赖:MyContainer需要知道Super_list,反之亦然。您需要找到一种方法来打破这种依赖关系。请注意,在您的代码中,前向声明是完全多余的。

另请注意,标准库容器并非旨在从 public 继承

关于依赖关系,您需要修改至少一个类,使其不需要另一个类的完整定义。假装公开继承std::list是可以的,那么唯一的选择是My_Container不需要完整的定义,SuperList让它持有一个(最好是智能的)指针:

class My_container
{
 private:
  Super_list* buddy;
}; 

这将允许您删除super_list.h包含。

一个不相关的警告:放入头文件是不好的using namespace std,因为它会将 using 指令强加于所有直接或间接包含您的头文件的代码。这可能会导致各种麻烦。我通常会走得更远,说你不应该在任何地方使用它。不是每个人都同意我的观点。

于 2012-11-29T20:17:12.367 回答
0

没有错误消息,不能说太多。

1)您可能想在 Super_list 中定义一些构造函数,将它们的参数转发给 std::list 构造函数。

2)每次我尝试做这样的事情(或使用这样的事情)时,结果都是一个坏主意。为了保持封装,您可能需要一些全局函数:

template<class T>
new_func1(std::list<T> &l)

template<class T>
new_func2(std::list<T> &l)

等等

于 2012-11-29T20:18:51.790 回答
0

我会问你是否真的需要继承来获得额外的功能。尝试使用列表作为班级成员。它不仅会让你的类更容易改变,而且意味着使用你的类的代码不会关心它是否是一个列表。

这里有更多信息

于 2012-11-29T20:22:53.297 回答