2

私は学校制度のシミュレーションである私のプロジェクトをやっています。
このメソッドを Student のフレンドとして宣言したにもかかわらず、クラス Klasa (クラスのポーランド語) のメソッドがクラス Student のプライベート データにアクセスできないという事実に問題があります。

コードは次のとおりです。

最初の 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=iclassIndex にアクセスできないことを強調しています。

また、Klasa.h で、このメソッドを次のように宣言しました。bool assignToKlasa(Student* s);

では、学生で友達として宣言した後、学生の個人データにアクセスできない理由がわかりませんか? 手伝っていただけませんか?

4

2 に答える 2

4

の定義class Student { ... }もコンパイルされるべきではありません。宣言はエラーなので、それfriendも強調表示されていないことに驚いています。IDE が把握したことは、プライベート メンバーへのアクセスは、有効なfriend宣言なしでは許可されないということです。

エラーは、のメンバー関数をのフレンドとしてKlasa宣言するには、 の前方宣言では不十分であるということです。firstのクラス定義が必要です。KlasaStudentKlasa

したがって、次のようになります。

class Student; // forward declaration, because members of Klasa take Student*

class Klasa { 
    ... 
};

class Student { 
    ... 
};

を定義できますKlasa::assignToKlasa

于 2012-06-13T17:33:52.547 に答える
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' の無効な使用</p>

test3.cc:1: エラー: 'struct A' の前方宣言</p>

test3.cc: メンバー関数 'bool A::method(B*) const':

test3.cc:3: エラー: 'int B::x' は非公開です

test3.cc:15: エラー: このコンテキスト内

心配する必要があるのは最初のエラーだけです (他のエラーは、最初のエラーの説明または結果です)。では、どうすればこれを整理できるでしょうか。この問題を解決する簡単な方法の 1 つは、置換によって全体class Aをフレンドとして宣言することです。B

  friend bool A::method(B*) const;

  friend class A;

定義されています。

于 2012-06-13T17:36:46.213 に答える