继承自c ++标准库List类,用于添加更多方法

时间:2012-11-29 20:12:35

标签: c++ list class inheritance methods

我需要为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

我收到了一些与继承没有正确完成有关的错误。 在完成这项任务时,我将不胜感激任何帮助或其他想法。

谢谢:)

3 个答案:

答案 0 :(得分:2)

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

另请注意标准库容器aren't designed to be inherited from publicly

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

class My_container
{
 private:
  Super_list* buddy;
}; 

这样您就可以删除super_list.h include。

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

答案 1 :(得分: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)

答案 2 :(得分:0)

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

Here is more information