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

发布于 2024-12-10 15:32:15 字数 2359 浏览 0 评论 0原文

#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 中包含的所有继承函数之上。

在我的 main 中...

#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() 受到保护吗?这是为什么呢?我把它放在 public 下:

另外,这个上下文是怎么回事,我猜我只是在做整个继承的事情完全错误。任何帮助将不胜感激!

编辑:这是 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;
  }
  }
#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

That is my new class I just made that gives me the search and replace function, on top of all the inherited functions contained in llist.h

In my main...

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

using namespace std;

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

I'm trying to call addfront() which is a public function in the llist class. Then I want to call search() which is an inherited public function of the slist class. g++ gives me a few errors that I don't understand.

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

slist() is protected? Why's that? I put it under public:

Also whats up with the this context, I'm guessing I'm just doing the whole inheritance thing totally wrong. Any help would be appreciated!

Edit: Here's the llist class, if it helps

#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

This is llist.cpp with only the relevant functions pasted

#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;
  }
  }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

真心难拥有 2024-12-17 15:32:15

老实说,我看不出问题所在,但并非每个编译器都符合标准,因此我会尝试以下操作:

1)重命名您的类 - 如果它有效,则意味着它是由于命名冲突而导致的。

2) 删除 using 指令。

3)删除继承。如果在此之后它有效...您确实需要更改编译器。

4) 在类声明之前尝试#undef public。如果此后有效……那么,有人会和经理谈谈。

5)祈祷...

I honestly can't see the problem but not every compiler is standard-compliant, so I would try the following:

1) Rename your class - if it works, that means it's a because of a naming conflict.

2) Remove the using directives.

3) Remove the inheritance. If it works after this... you really need to change compilers.

4) Try #undef public before your class declaration. If it works after this... well, someone's in for a talk with the manager.

5) Pray...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文