2017-03-16 75 views
0

我想在不使用「this」指針的情況下訪問C++代碼中的基類數據。我的類是模板化的,ClassAClassB的基類,它是ClassC的基類。所有類都是從其基類公開派生的。我發現這個討論這讓我中途到一個解決方案,但並不能完全解決這個問題:C++名稱解析模板子類的子類

Why do I have to access template base class members through the this pointer?

該網頁提示我應該能夠解決我的問題與「使用」的聲明。這裏是什麼,我試圖做一個例子:

#include <iostream> 

template <typename FP> 
class ClassA 
{ 
    protected: 
    FP a ; 
} ; 

template <typename FP> 
class ClassB : public ClassA <FP> 
{ 
    using ClassA <FP> :: a ; 
    public: 
    void fooB (void) { std:: cout << a << std::endl ; } 
} ; 

template <typename FP> 
class ClassC : public ClassB <FP> 
{ 
    using ClassA <FP> :: a ; 
    public: 
    void fooC (void) { std:: cout << a << std::endl ; } 
} ; 

int main (int argc, char *argv[]) 
{ 
    ClassB <double> tempB ; 
    ClassC <double> tempC ; 

    tempB.fooB () ; 
    tempC.fooC () ; 

    return 0 ; 
} 

上面的代碼編譯失敗,給下面的錯誤:

stepTWO.cpp: In instantiation of ‘class ClassC<double>’: 
stepTWO.cpp:30:25: required from here 
stepTWO.cpp:8:12: error: ‘double ClassA<double>::a’ is protected 
     FP a ; 
      ^
stepTWO.cpp:20:11: error: within this context 
    class ClassC : public ClassB <FP> 

我發現的是「使用」將使在ClassBClassC可訪問的變量,但不是兩者。如果我在兩個類中都使用using語句,則會出現上面顯示的錯誤。所有繼承都是通過公共派生來完成的。

有誰知道一個解決方案,使這項工作? (除了使用「這個」或完全合格的範圍名稱來訪問我的數據元素?)

+1

你有沒有試過在'ClassB'中使符號'protected'? –

+0

@Someprogrammerdude - 謝謝!在這些建議之前,我沒有意識到這種事情在「使用」方面至關重要。非常感激! –

回答

2

您的問題在於,ClassBusing ClassA <FP> :: a ;是在類的私有部分。這意味着派生類將無法訪問它。你需要做的是把它放在一個受保護的部分,如變量聲明爲ClassA。這樣做你會得到:

#include <iostream> 

template <typename FP> 
class ClassA 
{ 
    protected: 
    FP a ; 
} ; 

template <typename FP> 
class ClassB : public ClassA <FP> 
{ 
    protected: 
    using ClassA <FP> :: a ; // protected so it can be inherited 
    public: 
    void fooB (void) { std:: cout << a << std::endl ; } 
} ; 

template <typename FP> 
class ClassC : public ClassB <FP> 
{ 
    using ClassA <FP> :: a ; 
    public: 
    void fooC (void) { std:: cout << a << std::endl ; } 
} ; 

int main (int argc, char *argv[]) 
{ 
    ClassB <double> tempB ; 
    ClassC <double> tempC ; 

    tempB.fooB () ; 
    tempC.fooC () ; 

    return 0 ; 
} 
+0

謝謝!我甚至沒有想到要去那裏看看。解決了! –

+0

@PatrickKelly沒問題。樂意效勞。 – NathanOliver