2017-05-09 384 views
2

我一直在想什麼呢下面平均值(從cppreference pimpl採取的代碼片段)類名後的雙冒號(聲明) - 這是什麼意思?

class widget::impl { 
     ^^^^^^^^^^^^ 

    ... 
}; 

是什麼a_class::another_class意思?那是一個名字空間嗎?或者是內部類宣佈不是主要類?

+1

的可能的複製[什麼是預謀雙冒號的意思是「::」?](http://stackoverflow.com/questions/4269034/what-is-the-meaning-of-prepended-double-colon) – Badda

+1

@Badda:「前綴」是指「前」,而不是「之間的」或「後」。 (IOW,不是重複的,C++語法對命令非常敏感) – MSalters

回答

3

或者說是一個內部類聲明不主要的類?

賓果。要超清楚,iit實際上是一個內部類,它定義了以外的封閉類。

這是一個方便的技巧,如果你想使用你的類作爲實現細節成員般的訪問類,但不希望該嵌套類的定義發佈到你的類的客戶。

1

這是一個內部類。

class Widget 
    { 
    // ... 

    private: 
    class impl;   

    }; 

    // Then, typically in a separate implementation file: 
    class Widget::impl 
    { 
    public: 
    // ... 
    T1 t1_; 
    T2 t2_; 
    }; 
+0

:-) auto_ptr被刪除 –

0

可能是內部類的前向聲明例如爲:

class A{ 
class B; 

}; 

class A::B { 

}; 
1

::運算符是scope resolution operator的聲明。它限定了表達的範圍。在你的情況下,有資格與範圍widget表達class impl,即屬於widgetimpl。請看下面的例子,其在不同的範圍定義了兩個impl類:

// global impl 
class impl; 

class widget 
{ 
    // widget's impl 
    class impl; 
}; 

class widget::impl 
{ 
    // Define widget's impl 
}; 

class impl 
{ 
    // Define global impl 
}; 

範圍解析運算符可以讓你清楚地聲明您所定義的類。