C 中類B需要訪問類A的私有成員變數,除了將B宣告為A的友元類外還有其它方法嗎?

時間 2021-05-11 20:14:43

1樓:春秋代序

友元函式可不可以呢。將類B的成員函式宣告為類A的友元函式,這樣的話比整個類宣告為友元類更安全一點。

現在初學c++的大學生應該都會想到教材的友元成員函式這種簡單方法吧,不知道樓主是不是這個意思,如果樓主是所有友元方法都不想用,那就打擾了

2樓:陳俊皓

紙上談兵的方法是,讓類的乙個公共成員函式返回這個類的乙個私有資料成員的引用(引自Visual C++ 2008大學教程第二版 P418)。

3樓:

linux kernel source 裡面有乙個macro叫container_of,你可以參考一下裡面如何普遍地計算偏移量

4樓:林杰

既然是私有變數,就是不想讓其它類訪問,這是C++中對類的私有變數的定義。

你現在已經有需求訪問A的私有變數了,正確方法是:

把類A中的變數宣告為Public。

新增公有方法。

其它的方法都會對程式的可理解性、可維護性造成各種困擾,非正途。

5樓:Tim Shen

// 喂喂我只是在開玩笑啊= =

#define private public#include

#undef private

6樓:白如冰

按照偏移量計算並不是個好辦法,假如類的成員有不同的資料型別,那麼必然會有問題

所以稍微比較正常的方法是重新定義乙個類,所有成員都和前乙個一樣,不過訪問許可權都是public

再把指標reinterpret_cast一下就好這種方法只要這兩個類在相同的模組,使用相同的編譯器、相同的編譯選項進行編譯,一般是不會有問題的

class A

privateint m_xdouble m_y;

};class PA;然後

A *p1 = new A;

PA * p2 = reinterpret_cast(p1);

p2->m_y;

但是這個方法依然很二逼,因為這個問題本來就很扯淡屋子有門,我可以教你怎麼砸牆,但是牆塌了你被埋了不是我的事

7樓:

要不要用和能不能是兩回事

classA;

intmain

(int

argc

,char

*argv

)私有變數也只是在編譯時不能被非友元類訪問用位址訪問就好了

不過比較麻煩,也容易出問題

在有虛函式的時候還需要考慮虛表的大小

所以還是用友元類吧

c 中如何給類的私有成員賦值?

zhLzm 最好的是通過建構函式給類的私有成員進行初始化 可以有多種初始化建構函式 如果需要在操作中設定某個私有變數基於C 類的封裝特性,最好編寫一個函式去修改需要改變的成員產量。 王祺 假設你的類在a.h中 define private public include a.h undef priva...

C 中類的資料成員(data member)能出現未初始化(uninitialized)的狀態嗎?

1.如果在乙個函式類定義,那麼在這兩個類裡的資料成員都未初始化,都是不確定的值。如果是在全域性空間定義,那built in type就是預設值,類就是預設構造的。你可以自己列印出來看看 2.是不是 class type 在進行預設初始化的時候遞迴呼叫父類的建構函式,而且類中的資料成員也按照規則進行初...

C 在類中能定義本身型別的成員嗎?

番茄.go 至少有兩種情況是允許的。指標靜態成員變數 Member.cpp include classA AA a int main 執行 g Wall O2 o Member Member.cpp Member An object of class A.An object of class A.A...