我需要为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
我收到了一些与继承没有正确完成有关的错误。 在完成这项任务时,我将不胜感激任何帮助或其他想法。
谢谢:)
答案 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)
我会问你是否真的需要继承以获得额外的功能。尝试使用列表作为您班级的成员。它不仅可以让您的课程更容易更改,而且意味着使用您的课程的代码不关心它是否是一个列表。