簡體   English   中英

好友成員函數無法訪問私有成員數據

[英]friend member function can't access private member data

我嘗試使用友元函數訪問類 X 的私有成員數據,該友元函數本身是類 A 的成員函數。
這是代碼:

class X {
    int foo;
public:
    friend void A::func(X x1);
};

class A {
public:
    void func(X x1) { x1.foo = 999; }
};

這不會編譯的原因:
Error C2248 'X::foo': cannot access private member declared in class 'X'

我嘗試更改順序,在 X 之前聲明 A,但沒有幫助。
這是什么原因造成的?

您必須正確拆分聲明和定義,因為您有循環依賴:

class X;

class A {
public:
    void func(X x1);
};

class X {
    int foo;
public:
    friend void A::func(X x1);
};

void A::func(X x1) { x1.foo = 999; }

演示

還有一個你忽略的錯誤。 即:

錯誤:“A”尚未聲明

您需要先使用該函數聲明類A ,然后才能在X中將其作為友元引用。 但是,該函數需要一個X ,因此您還需要先聲明X

它應該看起來像:

class X;

class A {
public:
    void func(X x1);
};

class X {
    int foo;
public:
    friend void A::func(X x1);
};

void A::func(X x1) { x1.foo = 999; }

您必須在類 X 之前定義類 A,例如

class X;

class A {
public:
    void func(X x1);
};

class X {
    int foo;
public:
    friend void A::func(X x1);
};

void A::func(X x1) { x1.foo = 999; }

或者代替前向聲明

class X;

您可以使用詳細的類型說明符,例如

class A {
public:
    void func(class X x1);
};

class X {
    int foo;
public:
    friend void A::func(X x1);
};

void A::func(X x1) { x1.foo = 999; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM