2017-03-16 63 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