0

首先抱歉,如果我选择了错误的标题,但不知道如何命名。

先说代码结构:

//== 1st file ==
class A {
private:
    int x;
public:
    int GetX() { return x; }
};

//== 2nd file ==
class B {
private:
    A ob1;
public:
    virtual A & GetARef() { return ob1; }
};

class C : public B {
private:
    A ob2;
public:
    A & GetARef() { return ob2; }
};

class D : public B {
public:
    // something else w/e
};


//== 3rd file ==
class E {
private:
    std::map <int,C> m;
public:
    C* GetCPtr(int idx) { return &m[idx]; }
};

//== 4th file ==
void foo(E & E_Obj) {
    std::vector <B*> v;
    v.push_back(E_Obj.GetCPtr(0));
    v.push_back(/*some pointer to D class*/);
    Boo(v); // FORGOT TO ADD IT ! Sorry
};

//== 5th file ==
void Boo(std::vector <B*> & v) {
    std::cout << v[0]->GetARef().GetX(); // returns B::ob1 's x instead of C::ob2 's x.
};

正如评论中所写,Boo 得到了错误的“x”。我只是想知道这是因为指针“超出范围”还是我设计错误的东西。如何解决这个问题,这样我就可以得到正确的 x (C::ob2 的一个)。

抱歉有点奇怪的类名等,但原始代码要长得多,所以我试图只展示这种情况。

@edit 忘了在 Foo() 中添加它,它返回我所期望的 - C::ob2 的 x。

4

2 回答 2

0

这是你正在做的事情的本质

#include <iostream>

using namespace std;

class Base{
        const int b = 0;
        public:
        virtual const int& getInt(){
                return b;
        }   
};
class LeafOverriding : public Base{
        const int l = 1;
        public:
        virtual const int& getInt(){
                return l;
        }   
};
class Leaf : public Base{
};

int main(){
        cout << Leaf().getInt() << '\t' << LeafOverriding().getInt() << endl;
}

它没有问题(即它确实输出 0 1)。我想说你的代码片段——顺便说一句,它不能编译——并不代表真正的代码。

我太懒了,我强迫你用 C++11 支持编译它,因为const int b = 0const int l = 1:)

于 2013-09-05T15:13:17.440 回答
0

很抱歉没有在评论中留下回复,但我认为值得整篇文章。也很抱歉这么晚回复。我花了一整天的时间慢慢地挖掘代码,因为你已经证明我的编码很好(除了示例代码中的几个拼写错误,对此感到抱歉)。实际上,在一个接一个地重写代码之后,我终于在我通常不会寻找的地方找到了麻烦制造者。我的同事在对一些东西进行排序时不是在切换相关向量中的指针,而是切换它们的内容。

类似的东西

vector <E*> v;
// ...
*v[i] = ...

代替

v[i] = ...

修复后,它确实按预期工作。感谢您的帮助和清理工作。也很抱歉浪费您的时间。

于 2013-09-06T11:07:59.030 回答