2014-10-18 72 views
-1

声明为private成员,我必须写一个C++代码也必须执行下列类的多个对象的排序:不能访问

class student 
{ 
    int roll, m[5], total; 
    bool pass; 
    char name[30]; 
public: 
    void read(); 
    void result(); 
    void print(); 
    void operator=(student&); 
    friend void sort(student, int); 
}; 
void sort(student var[], int size) 
{ 
    int s,t; 
    for (s = 0; s<size; s++) 
    for (t = 0; t<size; t++) 
    { 
     if (var[s].total<var[t].total)  //---------line 22---------- 
    { 
      student x; 
      x = var[s]; 
      var[s] = var[t]; 
      var[t] = x; 
     } 
    } 
} 

void student::operator=(student &x) 
{ 
roll=x.roll; 
strcpy_s(name,x.name); 
for(int v=0;v<5;v++) 
m[v]=x.m[v]; 
total=x.total; 
pass=x.pass; 
} 
void main() 
{ 
student s[4]; 
int ni, n; 
cout<<"Enter number of student records: "; 
cin >> n; 
for (ni = 0; ni<n; ni++) 
{ 
    s[ni].read(); 
    s[ni].result(); 

} 
sort(s, n); 
cout<<endl<<"List sorted based on total: "<<endl; 
for (ni = 0; ni<n; ni++) 
{ 
    s[ni].print(); 
} 
} 

我使用Visual C++ 2008年当我编译此代码它显示两个错误:

Error1 error C2248:'student::total': cannot access private member declared in class 'student' 


Error2 error C2248:'student::total': cannot access private member declared in class 'student' 

这些错误显示在访问总数的同一行22中。虽然sort()是朋友函数,但我得到了这个可访问性错误。

我注意到如果总宣布公开,那就没有错误。 但按照类规范,它必须是私有的。请帮帮我。

+5

'无效排序(学生VAR [], int size)'不是'friend void sort(student,int);'的函数。 – 2014-10-18 18:33:37

+0

朋友无效排序(student [],int);谢谢。 – 2014-10-18 18:36:17

+0

你不需要一个赋值操作符。自动生成的就足够了。 – 2014-10-18 19:01:11

回答

0

正确的友元函数的声明看起来像

friend void sort(student[], int); 

有函数声明,并在你的代码的函数定义之间的差异。他们不重合 考虑到的是,拷贝赋值运算符的正确的声明看起来像

student & operator =(const student &);  

也起到主要应返回类型为int

int main() 
+0

请告诉我const是做什么的? – 2014-10-18 18:45:55

+0

@Ahhilash Iyer这意味着赋值运算符右侧的对象不会被更改。它被认为是一个不可改变的对象。 – 2014-10-18 18:47:44

+0

好的。还有更多的代码要添加。排序是为学生对象完成的,所有的改变都给了我正确的结果。但我必须将通用数据排序为此代码的一部分。它可能是int,float,string(当然还有学生对象)。如果使用模板,如何为不同的数据类型指定代码? – 2014-10-18 18:52:49