C ++ Friend方法无法从类访问私有数据

时间:2012-06-13 17:22:04

标签: c++ class friend

我正在做的是模拟学校系统的项目 我有一个问题,即类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);

所以我不知道为什么在我作为朋友在学生中宣布私人数据后,我不会让我访问学生的私人数据?你能帮我吗?

2 个答案:

答案 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;

已定义。