0

我试图在不使用“this”指针的情况下访问我的 C++ 代码中的基类数据。我的类是模板化的,并且ClassA是 的基类ClassB,它是ClassC. 所有类都是从它们的基类公开派生的。我发现这个讨论让我获得了一半的解决方案,但并没有完全解决它:

为什么我必须通过 this 指针访问模板基类成员?

该页面表明我应该能够使用“使用”语句解决我的问题。这是我正在尝试做的一个例子:

#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>

我发现“使用”将使变量可以在 ClassB ClassC访问,但不能在两者中访问。如果我将 using 语句放在两个类中,我会得到上面显示的错误。所有继承都是通过公共派生完成的。

有谁知道使这项工作的解决方案?(除了使用“this”或完全限定的范围名称来访问我的数据元素?)

4

1 回答 1

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 ;
}
于 2017-03-16T16:11:54.610 回答