我正在做的是模拟学校系统的项目 我有一个问题,即类Klasa(类的波兰语)中的方法无法访问类Student中的私有数据,即使我将此方法声明为Student中的朋友。
以下是代码:
First Student.h:
#include <iostream>
#include "Klasa.h"
#include "SubjectType.h"
#include "SubjectGrades.h"
using namespace std;
class Klasa;
class SubjectGrades;
class Student
{
private:
char* name;
int id;
Klasa* myClass;
//School* mySchool;
int classIndex; //numer w dzienniku - zrobić prywatne z akcesorami
static int counter;
public:
Student();
Student(char*);
Student(const Student&);
Student& operator= (const Student&);
~Student();
//bool assignToSchool(School*)
//bool resignFromSchool();
void assignToClass(Klasa*);
void resignFromClass();
double getMyAverageGrade(SubjectType type) const ; //srednia ocen z danego przedmiotu dla danego ucznia
double getMyAverageGrade() const; //średnia ocen dla danego ucznia
bool operator== (const Student&);
bool operator!= (const Student&);
friend ostream& operator<< (ostream&, const Student&);
// akcesory
int GetclassIndex() const;
int SetclassIndex(int i);
friend bool Klasa::assignToKlasa(Student* s);
char* GetName() const { return name; }
};
现在来自Klasa班的方法:
bool Klasa::assignToKlasa(Student* s)
{
if(studentCount < maxStudentCount)
{
if(containsStudent(s))
return false;
if(studentCount < klasaSize) //jest miejsce dla studenta
{
int i = 0;
while(studentList[i] != NULL)
i++;
studentList[i] = s;
s->classIndex=i;// = i; //tu musi byc setter
}
//WHATS BELOW DOESN'T MATTER FOR THIS PROBLEM, SO U DON;T NEED TO READ.
else
{
cout << "Zwiekszamy rozmiar!\n";
//musimy zwiększyć rozmiar tablicy studentList
Student** newStudentList = new Student*[klasaSize + sizeStep];
for(int i = 0; i < klasaSize; ++i)
newStudentList[i] = studentList[i];
for(int i = klasaSize; i < klasaSize + sizeStep; ++i)
newStudentList[i] = NULL;
klasaSize += sizeStep;
delete[] studentList;
studentList = newStudentList;
studentList[studentCount] = s;
s->SetclassIndex(studentCount); //tu ma byc setter
}
s->assignToClass(this); //mówimy studentowi - "jestem twoją klasą"
studentCount++;
cout << "Dodano studenta!\n";
return true;
}
return false;
}
它强调s->classIndex=i
无法访问classIndex。
同样在Klasa.h中,我将此方法声明为:bool assignToKlasa(Student* s);
所以我不知道为什么在我作为朋友在学生中宣布私人数据后,我不会让我访问学生的私人数据?你能帮我吗?
答案 0 :(得分:4)
您对class Student { ... }
的定义也不应该编译。 friend
声明是一个错误,所以我很惊讶也没有突出显示。您的IDE已经发现,如果没有有效的friend
声明,则不允许访问私有成员。
错误是Klasa
的前向声明不足以声明Klasa
的成员函数是Student
的朋友。您首先需要Klasa
的类定义。
所以,它应该是:
class Student; // forward declaration, because members of Klasa take Student*
class Klasa {
...
};
class Student {
...
};
然后您可以定义Klasa::assignToKlasa
。
答案 1 :(得分:1)
对于此等效代码
class A;
class B {
int x;
public:
B(int __x) : x(__x) {}
friend bool A::method(B*) const; // error: undefined member cannot be friend
//friend class A; // fine: class A is declared and can be used
};
class A {
int y;
pu8blic:
A(int __y) : y(__y) {}
bool method(B*b) const
{ return y == b->x; }
};
我收到错误消息(使用gcc 4.3.2):
test3.cc:7:错误:无效使用不完整类型'struct A'
test3.cc:1:错误:'struct A'的前向声明
test3.cc:在成员函数'bool A :: method(B *)const':
中test3.cc:3:错误:'int B :: x'是私有的
test3.cc:15:错误:在此上下文中
第一个错误是 only 你必须担心的错误(其他错误是第一个的解释或后果)。那怎么能解决这个问题呢?解决问题的一种简单方法是通过替换
来声明整个class A
成为B
的朋友
friend bool A::method(B*) const;
与
friend class A;
已定义。