不可用的派生类std :: map成员

时间:2015-05-14 17:00:34

标签: c++ inheritance member

请注意以下代码:

Class Foo

class Foo:
{
   public:
     Foo();
     ~Foo();
}

C类

class C
{
    public:
      C();
      ~C();
      void setA(A* a) { m_a = a; }
      A* getA() { return m_a; }

    private:
    A* m_a;
}

抽象类A:

class A
{
public:
    // Constructor, Destructor
    A (C* c) : parent (c)
    virtual ~A(); 
    // Some RELEVANT pure abstract methods
    void addFoo(Foo* f, std::string& id) = 0;
    Foo* getFoo(std::string id)= 0;

protected:
    C* parent;
    std::map< std::string, Foo* > m_Foos;
};

在B.h

class B : public A
{
public:
    // Constructor, Destructor ...
    B(C* c);
    virtual ~B();
    // Definition of those pure RELEVANT methods
    virtual void addFoo(Foo* f, std::string& id);
    virtual Foo* getFoo(std::string id);        
};

在B.cpp

// Some methods implementation ...
B::B(C* c) : A(c) { }

Foo* B::getFoo(std::string id)
{
    return m_Foos[id];
}

B::setFoo( Foo* f, std::string& id )
{
    m_Foos[id] = f;
}

然后,在代码的不同部分,一切运行顺利,直到我决定使m_Foos可继承:

   C* c = new C();
   c->setA(new B(c));

这在以前的执行中毫无疑问:

Foo* f = new Foo();
...
c->getA()->setFoo(f);

尝试访问setFoo中的m_Foos时程序崩溃。由于某些原因,我还不明白,m_Foos未在B中正确初始化(例如,运行m_Foos.size()返回疯狂值)。请注意,我在运行时遇到错误,而不是在编译时。

编辑:这很奇怪,因为在A类中添加另一个类型为int的受保护成员变量允许在B :: setFoo()中完美地修改和读取...

2 个答案:

答案 0 :(得分:0)

我的通灵调试技巧告诉我,你的B要么是空指针,要么实际已经构建,要么过早地被破坏。

您是否意外地在堆栈上创建了它并存储指针?

编辑:鉴于向A添加成员会改变行为,代码中的某个地方肯定会进入未定义的行为。我们可能需要看到更多的代码来帮助更多的一般猜测。

答案 1 :(得分:0)

代码(有一些更正)对我有用。由于当你向A添加一些其他填充物时崩溃消失了,我相信你有内存损坏。尝试在A的构造函数中将填充符设置为已知值,并在到达崩溃位置时检查实际值。

除了验证其他地方发生了内存损坏之外,这实际上并没有帮助。