2012-10-21 166 views
0

如何訪問非靜態類成員?訪問類成員

class A 
{ 
    int value_ = 0;//I want to access this member in class inheriting from A 
}; 
template<class X = A> 
class Y :X 
{ 
static_assert(value_ == 0,"Non-zero not allowed");//here I want to access value_ from X which is A by default. Is this possible? 
}; 
+0

如果'value_'由'public'或'protected'那麼你可以從派生類訪問它,但是,就像普通的類成員,你真的只能用它的內部函數體。我想知道上面的結構甚至是有用的(如果它是合法的):你似乎認爲'value_'甚至在創建了'Y'(或'A')的實例之前有一個值。換句話說,你認爲'value_'存在於類級別(而不是對象級別)。但如果是這樣,爲什麼你不使用靜態成員? – jogojapan

+0

#jogojapan它不能在我的情況靜態 – smallB

+1

讓我改一下我的問題:沒有靜態測試('static_assert')又有什麼意義的非靜態成員?靜態測試應用於類(即數據類型本身),而不是單個實例。但非靜態成員在每種情況下通常具有不同的價值。 – jogojapan

回答

2

由於幾個原因,您具體做的事情是不可能的。

首先,static_assert需要它的一個參數是一個編譯時間常量表達式。 value_確實沒有。

你可以嘗試通過誣指constexpr,使之成爲常量表達式。但是C++ 11不允許constexpr用於非靜態數據成員。即使這樣做,這也不會有幫助,因爲value_是一個非靜態成員。因此,它還不存在。它只存在於存在實際的類實例時,這個實例具有this指針。您的static_assert表達式不會創建這些對象中的一個,因此無法訪問它。

因此,爲了使這個「工作」(到「工作」做有意義的範圍內),您必須:

  1. A一個constexpr構造,這樣就可以創建一個constexpr實例的。
  2. 您的static_assert實際上必須是創建使用constexpr構造函數並訪問相關數據成員的類型。

現在,如果你這樣做,你會發現,它不給你你想要(此基礎上聲明什麼,因爲你的問題沒有解釋它到底是什麼你」重新嘗試完成):

其次,我每次意味着每次創建此類的對象時,並且作爲X是模板參數,它是一個常量表達式。

注意static_assert靜態。而「每次創建此類的對象」是一個運行時事件。對於運行時發生的事情,您無法執行靜態測試

你想要的是常規assert而不是static_assert

+0

#Nicol Bolas,嘿,謝謝,會盡量按照你的指示,看看會發生什麼。 – smallB