0

请参阅下面代码中的示例,在 B 类中。我做错了什么,记忆明智吗?

我遇到了之前没有的分段错误......

class Obj
{
};

class ObjDerived : public Obj
{
};

template <typename T>
class A
{
    public:
    Obj<T> *pObj;

    public:
    A(Obj<T>* pO) : pObj(pO) {}
    void doSomethingWithObj()
    { pObj->print(); }

};

template <typename T>
class B : public A<T>
{
    public:
    B() : A<T>(&o), o(ObjDerived<T>(1.0)) {}

    void doSmthg()
    { (this->pObj)->print(); }

    public:
        ObjDerived<T> o;

};
4

2 回答 2

1

我认为您需要的是在 class 中创建print()一个虚函数并在 class 中Obj覆盖它ObjDerived。然后你就不需要搞乱那些邪恶的原始指针了。

于 2013-09-29T21:36:17.913 回答
0

我认为您的代码会出现的主要问题是,在您的构造函数中,B您将尚未创建的变量传递给基类。

B()
    : A<T>( &o)
    , o( ObjDerived<T>( 1.0f))
{}

在构造函数中,命令按顺序执行,因此您将B::o尚未创建A::A的传递给然后创建B::o变量。

想到的唯一解决方案,如果你真的想坚持这个类结构,那就是创建A::pObj一个指向指针的指针,这样它就可以通过首先访问新变量来访问B::o. 然而,在我看来,这看起来非常混乱。

编辑:正如约翰史密斯所说,我认为你需要考虑使用虚函数和继承来整理类结构。

于 2013-09-29T21:43:18.413 回答