是什么让我的构造函数受到保护?

时间:2011-10-18 09:35:21

标签: c++ inheritance constructor

#ifndef SLIST_H
#define SLIST_H
#include "llist.h"

using namespace std;

class slist:public llist{

 public:
  slist();
  int search(el_t Key);
  void replace(el_t Elem, int I);
};
#endif

这是我刚刚创建的新类,它在llist.h中包含的所有继承函数之上提供了搜索和替换函数。

在我的主...

#include "slist.h"
#include <iostream>

using namespace std;

int main(){
  slist list;
  list.addFront(4);
  cout<<list.search(4);
}

我正在尝试调用addfront(),它是llist类中的公共函数。然后我想调用search(),它是slist类的继承公共函数。 g ++给了我一些我不理解的错误。

slist.h: In function âint main()â:
slist.h:10: error: âslist::slist()â is protected
main.cpp:7: error: within this context

slist()受到保护?为什么?我把它公之于众:

还有这个背景,我猜我只是把整个继承完全错了。任何帮助将不胜感激!

编辑:这是llist类,如果它有帮助

#ifndef LIST_H
#define LIST_H
#include <iostream>
using namespace std;

class llist{
 protected:

   typedef int el_t;
   el_t total;

  struct Node{
    int Elem;
    Node *Next;
  };

  Node *Front;
  Node *Rear;
  Node * Curr;

public:
 class Overflow{};
 class Underflow{};
 class Range{};
 llist();
 ~llist();
 bool isEmpty();
 void displayAll();
 void addRear(el_t NewNum);
 void deleteFront(el_t& OldNum);
 void addFront(el_t NewNum);
 void deleteRear(el_t& OldNum);
 void deleteIth(int I, el_t& OldNum);
 void addbeforeIth(int I, el_t newNum);
 class Overflow;

};
#endif

这是llist.cpp,只粘贴了相关的功能

#include "llist.h"
#include <iostream>

using namespace std;
int total=0;

llist::llist(){
    Front=NULL;
    Rear=NULL;
    total=0;
}

llist::~llist(){
  while(Front!=NULL){
    int z;
    deleteFront(z);
  }
}
bool llist::isEmpty(){
if(Front==NULL){
  return true;
}
return false;
}
void llist::displayAll(){
 Curr=Front;
 if(isEmpty()){
   cout<<"[ empty ]"<<endl;
 }else{
  while(Curr!=NULL){\
    cout<<"curr != NuL"<<endl;
    cout<<Curr->Elem<<endl;
    Curr=Curr->Next;
  }
 }
 }



void llist::addFront(el_t NewNum){
    if(isEmpty()){
       Node *x=new Node;
       x->Next=Front;
       Rear=Front;
       Front=x;
       Front->Elem=NewNum;
        }else{
      Node *x=new Node;
      x->Next=Front;
      Front=x;
      Front->Elem=NewNum;
      ++total;
  }
  }

1 个答案:

答案 0 :(得分:1)

老实说,我看不出问题,但并不是每个编译器都符合标准,所以我会尝试以下方法:

1)重命名你的课程 - 如果它有效,那就意味着这是因为命名冲突。

2)删除using指令。

3)删除继承。如果它在此之后工作......你真的需要改变编译器。

4)在课堂申报前尝试#undef public。如果它在此之后有效......好吧,有人在和经理谈谈。

5)祈祷......