Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 派生类模板没有';看不到基类';s成员_C++ - Fatal编程技术网

C++ 派生类模板没有';看不到基类';s成员

C++ 派生类模板没有';看不到基类';s成员,c++,C++,我正在开发一个派生自另一个类的类,但我被以下代码卡住了: template <class A, class B, class C> class BaseClass { public: BaseClass(){} virtual void amethod( A* aPtr=0) { mAPtr=aPtr; } virtual void init()=0; protected: A * mAPtr; B* mBPtr

我正在开发一个派生自另一个类的类,但我被以下代码卡住了:

template <class A, class B, class C>
class BaseClass
{
public:
    BaseClass(){}
    virtual void amethod( A* aPtr=0)
    {
        mAPtr=aPtr;
    }
    virtual void init()=0;
protected:
    A * mAPtr;
    B* mBPtr;
    C * mCPtr;
};
template <class A,class B,class C>
class ChildClass: public BaseClass<A,B,C>
{
public:
    ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0):mAPtr(aAptr)
      ,mBPtr(aBPtr)
      ,mCPtr(aCPtr)
    {}

};
int main()
{

    return 0;
}
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
{
    mAPtr = aAptr;  // <-- Member belongs to parent but you can access it
    mBPtr = aBPtr; // <-- Member belongs to parent but you can access it
    mCPtr = aCPtr; // <-- Member belongs to parent but you can access it
}
模板
类基类
{
公众:
基类(){}
虚空法(A*aPtr=0)
{
mAPtr=aPtr;
}
虚拟void init()=0;
受保护的:
A*mAPtr;
B*mBPtr;
C*mCPtr;
};
模板
类ChildClass:公共基类
{
公众:
ChildClass(A*aAptr=0,B*aBPtr=0,C*aCPtr=0):mAPtr(aAptr)
,mBPtr(aBPtr)
,mCPtr(aCPtr)
{}
};
int main()
{
返回0;
}
编译器指出子类没有任何父字段

编译器输出:

 In constructor 'ChildClass<A, B, C>::ChildClass(A*, B*, C*)'
 In constructor 'ChildClass<A, B, C>::ChildClass(A*, B*, C*)'
error: class 'ChildClass<A, B, C>' does not have any field named 'mAPtr'
error: class 'ChildClass<A, B, C>' does not have any field named 'mBPtr'
error: class 'ChildClass<A, B, C>' does not have any field named 'mCPtr'
构造函数“ChildClass::ChildClass(A*,B*,C*)”中的

在构造函数“ChildClass::ChildClass(A*,B*,C*)”中
错误:类“ChildClass”没有任何名为“mAPtr”的字段
错误:类“ChildClass”没有任何名为“mBPtr”的字段
错误:类“ChildClass”没有任何名为“mCPtr”的字段
我在谷歌上搜索过,但找不到答案:
Thx预先

您不能初始化基类“派生类”构造函数的初始值设定项列表中的数据成员。您可以在构造函数的主体中分配它们:

ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0) {
  mAPtr = aAptr;
  mBPtr = aBPtr;
  mCPtr = aCPtr;
}

然而,基类看起来设计得很糟糕:它唯一的构造函数根本没有初始化三个数据成员(甚至没有初始化为
NULL
),因此它们最终包含随机垃圾。在
BaseClass
中使用三参数构造函数来初始化数据成员可能是有意义的;
ChildClass
的构造函数只需通过其initialzier列表转发到该类。

构造函数不能直接在派生类构造函数中初始化基成员变量

ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
    : mAPtr(aAptr)  // <-- Member belongs to parent
    , mBPtr(aBPtr) // <-- Member belongs to parent
    , mCPtr(aCPtr) // <-- Member belongs to parent
{
}


另外,请记住,您需要使用上面的anwser在派生类中定义void init()方法,我做了一些更改:

ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
    {
        this->mAPtr=aAptr;
        this->mBPtr=aBPtr;
        this->mCPtr=aCPtr;
    }
如果没有this指针,编译器将看不到来自父级的变量。 谢谢!,顺便说一下,编译是针对Linux的,使用Gcc编译器Gcc版本4.7.3。

Juan,以下代码:

template <class A, class B, class C>
class BaseClass
{
public:
    BaseClass(){}
    virtual void amethod( A* aPtr=0)
    {
        mAPtr=aPtr;
    }
    virtual void init()=0;
protected:
    A * mAPtr;
    B* mBPtr;
    C * mCPtr;
};
template <class A,class B,class C>
class ChildClass: public BaseClass<A,B,C>
{
public:
    ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0):mAPtr(aAptr)
      ,mBPtr(aBPtr)
      ,mCPtr(aCPtr)
    {}

};
int main()
{

    return 0;
}
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
{
    mAPtr = aAptr;  // <-- Member belongs to parent but you can access it
    mBPtr = aBPtr; // <-- Member belongs to parent but you can access it
    mCPtr = aCPtr; // <-- Member belongs to parent but you can access it
}
ChildClass(A*aAptr=0,B*aBPtr=0,C*aCPtr=0)
{

mAPtr=aAptr;//我不确定,但可能无法使用构造函数初始值设定项初始化继承的字段。请尝试在构造函数的主体中初始化它们。(顺便问一下,STL与此问题有什么关系?)Visual Studio 2012完美地编译了这段代码。就像@MatteoItalia一样,我想知道STL与此有什么关系。我编辑了这个问题,以反映问题主体中的内容。请添加有关如何涉及STL的详细信息,如果它真的涉及:)@Helix,那么这是VS2012中的一个bug
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
{
    mAPtr = aAptr;  // <-- Member belongs to parent but you can access it
    mBPtr = aBPtr; // <-- Member belongs to parent but you can access it
    mCPtr = aCPtr; // <-- Member belongs to parent but you can access it
}
ChildClass( A* aAptr =0, B * aBPtr= 0, C* aCPtr= 0)
{
    BaseClass<A,B,C>::mAPtr = aAptr;
    BaseClass<A,B,C>::mBPtr = aBPtr;
    BaseClass<A,B,C>::mCPtr = aCPtr;
}