在继承方面遇到麻烦,我理解它背后的想法但由于某种原因我的代码只是不合作。这是我的基本头文件:
#ifndef INTNODE_H
#define INTNODE_H
struct IntNode
{
int data;
IntNode *next;
IntNode( int data ) : data(data), next(0) {}
};
class IntList
{
protected:
IntNode *head;
IntNode *tail;
public:
IntList();
IntList( const IntList & );
~IntList();
void display()const;
void push_front(int);
void push_back(int);
void pop_front();
void select_sort();
void insert_sorted(int);
void remove_duplicates();
const IntList & operator = (const IntList &);
void clear();
};
#endif
我的派生类的.h
#ifndef SORTEDSET_H
#define SORTEDSET_H
#include "IntList.h"
class SortedSet : public IntList
{
public:
SortedSet();
SortedSet(const SortedSet &);
SortedSet(const IntList &);
~SortedSet();
bool in (int);
const SortedSet operator |(const SortedSet);
const SortedSet operator &(const SortedSet);
void add (int );
void push_front(int );
void push_back(int);
void insert_sorted(int);
SortedSet operator |=(SortedSet);
SortedSet operator &=(SortedSet);
};
#endif
但是当我尝试编译时,它告诉我我的SortedSet类没有" head"或"尾巴"数据成员让我觉得SortedSet从未真正继承bas类。不确定我做错了什么?
编辑:这是派生类的.cpp,基类的.cpp相当冗长,但我也可以发布
#include <cstdlib>
#include <iostream>
#include "SortedSet.h"
using namespace std;
SortedSet::SortedSet():head(0),tail(0){}
SortedSet::SortedSet(const SortedSet &s):head(0),tail(0)
{
for (IntNode *i=s.head;i!=0;i=i->next)
{
push_back(i->data);
}
}
SortedSet::SortedSet(const IntList &l)
{
for (IntNode *i=l.head;i!=0;i=i->next)
{
push_back(i->data);
}
remove_duplicates();
select_sort();
}
SortedSet::~SortedSet(){}
SortedSet::in(int d)
{
for(IntNode *i=head;i!=0;i=i->next)
{
if(i->data==d)
return true;
}
return false;
}
和她是我得到的错误
IntList.cpp: In member function 'const IntList& IntList::operator=(const IntList&)':
IntList.cpp:226: warning: control reaches end of non-void function
SortedSet.cpp: In constructor 'SortedSet::SortedSet()':
SortedSet.cpp:27: error: class 'SortedSet' does not have any field named 'head'
SortedSet.cpp:27: error: class 'SortedSet' does not have any field named 'tail'
SortedSet.cpp: In copy constructor 'SortedSet::SortedSet(const SortedSet&)':
SortedSet.cpp:29: error: class 'SortedSet' does not have any field named 'head'
SortedSet.cpp:29: error: class 'SortedSet' does not have any field named 'tail'
IntList.h: In constructor 'SortedSet::SortedSet(const IntList&)':
IntList.h:35: error: 'IntNode* IntList::head' is protected
SortedSet.cpp:39: error: within this context
SortedSet.cpp: At global scope:
SortedSet.cpp:49: error: ISO C++ forbids declaration of 'in' with no type
答案 0 :(得分:2)
构造函数的初始化列表无法初始化父类的任何成员。相反,您应该调用将进行正确初始化的父构造函数。
SortedSet::SortedSet(const SortedSet &s) : IntList(s) // ...
答案 1 :(得分:0)
您是否有可能尝试按如下方式初始化成员?
SortedSet(): head(nullptr), tail(nullptr){}
因为不允许这样做,所以你应该调用父构造函数
SortedSet(): Intlist(){}
与复制构造函数相同:
SortedSet(const SortedSet& other): Intlist(other){}
这适用于每种类型的构造函数。第二种选择是初始化构造函数体中的那些成员。
SortedSet(){
// do stuff with haid and tail
}
此前解决的BTW问题:C++: Why does my DerivedClass's constructor not have access to the BaseClass's protected field?
此处描述了无法从SortedSet(const IntList&amp;)中的IntList访问头部的原因:subtle C++ inheritance error with protected fields