2011-10-08 48 views

回答

2

允許使用protected類的唯一代碼使用一個變量成員(靜態或不)是問題類的明確朋友和類從類中派生的問題(當然,類本身的成員)。因此,如果「你」想訪問該值,那麼「你」必須是該類的朋友或從它派生的類的成員。

存在保護等級(public,protectedprivate)以提供數據保護。通過聲明成員爲protected,那類作家正在大約應該被允許觸摸到了一塊內存什麼碼半強烈的聲明。如果你不是一個派生類或已獲准使用明確的friend規範,那麼你不能碰它。

你不應該從一個類派生只是爲了獲得訪問protected靜態成員。你應該只從派生類派生,如果它是有道理的,根據你的派生類正在嘗試做什麼。

0

在宣佈爲受保護,靜態變量只能用在它的成員函數訪問和它的派生類(公共,保護繼承)。

0

我曾經在一個我無法修改的課程中遇到了這個問題(標準適配器),並在Google的幫助下提出了以下解決方案!

#include <iostream> 

class my_type{ 
protected: 
    static int var; 
}; 

int my_type::var = 0; 

int& get_var(my_type& obj){ 
    class protected_accessor : my_type{ 
    public: 
     static int& get_var(my_type&){ 
      return my_type::var; 
     } 
    }; 
    return protected_accessor::get_var(obj); 
} 

int main(){ 
    my_type obj; 
    std::cout << get_var(obj) << std::endl; 
    get_var(obj) = 1; 
    std::cout << get_var(obj); 
} 

我在我的小工具中使用了此代碼的變體:https://bitbucket.org/AraK/streamer/wiki/Developer_FAQ。尋找「流媒體標準適配器」。