Tell the error plzz

i m unble to use protected variables in inherited class so please help me
code is::
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include<iostream>

using namespace std;

class Book
{
      protected:
                int accessno,year,availbooks;
                char *author,*title,*publishername;
                float cost;
      public:
             void display();             
             void setvalues(int acno,char a[],char t[],int y,char pubn[],float c,int avail);

};

void Book::setvalues(int acno,char a[],char t[],int y,char pubn[],float c,int avail)
             {
                  accessno=acno;
                  author=a;
                  title=t;
                  publishername=pubn;
                  cost=c;
                  availbooks=avail;
             }
void Book::display()
             {
                  cout<<"\nBook details are:\n";
                  cout<<"Accession Number:"<<accessno<<endl;
                  cout<<"Author:"<<author<<endl;
                  cout<<"Title:"<<title<<endl;
                  cout<<"Publisher Name:"<<publishername<<endl;
                  cout<<"Cost:"<<cost<<endl;\
                  cout<<"Available Books:"<<availbooks<<endl;
             }

class Membership
{
      protected:
      int memberid,maxbooks;
      char *membername;
      public:
             Membership()
             {
                         maxbooks=5;
             }
             void setvalues(int memid,char n[])
             {
                           memberid=memid;
                           membername=n;
             }
             void display()
             {
                  cout<<"\nMember details are:\n";
                  cout<<"Member Id:"<<memberid<<endl;
                  cout<<"Member Name:"<<membername<<endl;
                  cout<<"Max Books:"<<maxbooks<<endl;
             }

};

class LibInfoSystem:public Membership , public Book
{
      public:
             void issuebook(Membership mp[],Book bp[],int memid,int accno)
             {
                  
                  while(mp!=NULL)
                  {
                                 if(mp->memberid == memid)
                                                 break;
                                 mp++;
                  }
                  while(bp!=NULL)
                  {
                                 if(bp->accessno == accno)
                                                 break;
                                 bp++;
                  }
                  
                  if( mp==NULL || bp ==NULL)
                               cout<<"Data entered is invalid";
                  else
                  {
                      if(mp->maxbooks>0 && bp->availbooks>0)
                      {
                                        cout<<"\nbook issued";
                                        mp->maxbooks--;
                                        bp->availbooks--;
                      }
                      else
                      {
                                        cout<<"book cannot be issued";
                      }
                  }
             }
};
I believe you are misunderstanding the concept of "protected". Protected fields and functions are accessible to inheritors of the class. Your use of them in LibInfoSystem is not this. From LibInfoSystem you can access this->memberid, but you cannot access another object's protected data:

1
2
Book someOtherBookThatIsNotPartOfMe;
someOtherBookThatIsNotPartOfMe.memberid; //wrong 


I believe this is the problem, unless I am proven wrong (which could happen as I am no guru of C++, but I do like it very much).
class LibInfoSystem:public Membership , public Book
I think LibInfoSystem is derived from Membership and Book

What exactly is the problem shubham jhandei?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//line 65
void issuebook(Membership mp[],Book bp[],int memid,int accno)
{
     
     while(mp!=NULL)
     {
                    if(mp->memberid == memid)
                                    break;
                    mp++;
     }
     while(bp!=NULL)
     {
                    if(bp->accessno == accno)
                                    break;
                    bp++;
     }

     // ...
}

Where is your bounds checking, you are assuming that memid and accno must be in mp and bp, but what if they are not. You will be trying to dereference corrupted data (right?)

Maybe I'm missing something...
Last edited on
the prob is it says you cannot access variables memberid and accessno
Last edited on
I ran a check and webJose is correct. A class can only access its own protected data inherited from its base classes. So LibInfoSystem has inherited the fields memberid, accessno, …, etc, but does not have access to another Book's accessno or Membership's memberid. I think you need to make LibInfoSystem a friend class of Book and Membership for that to be legal. A better solution might be to just create an accessor method for those fields.
Topic archived. No new replies allowed.