Что делает мой конструктор защищенным? - PullRequest
0 голосов
/ 18 октября 2011
#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 (), которая является публичной функцией в классе List. Затем я хочу вызвать 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 () защищен? Почему это? Я обнародовал это:

Кроме того, что с этим контекстом, я полагаю, я просто делаю все наследование совершенно неправильно. Любая помощь будет оценена!

Редактировать: вот класс List, если это поможет

#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 Ответ

1 голос
/ 18 октября 2011

Честно говоря, я не вижу проблемы, но не каждый компилятор соответствует стандарту, поэтому я бы попробовал следующее:

1) Переименуйте свой класс - если он работает, значит, это из-за конфликта имен.

2) Удалите директивы использования.

3) Убрать наследство. Если это сработает после этого ... вам действительно нужно поменять компиляторы.

4) Попробуйте #undef public перед объявлением класса. Если это сработает после этого ... ну, кто-то хочет поговорить с менеджером.

5) Молись ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...