加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 必须使用指针抽象类导致困难

发布时间:2020-12-16 10:20:25 所属栏目:百科 来源:网络整理
导读:我这里的第一个问题…… 我想使用一个抽象类A,我从中派生出一个B类(和B2,B3,……).我明白为了统一处理它们,我必须使用指向基类的指针,所以这里的类型为A *的变量. 在下面的示例中,我想填充aa类型为vector A *在功能f.由于我只能使用引用并且变量在f的末尾失
我这里的第一个问题……

我想使用一个抽象类A,我从中派生出一个B类(和B2,B3,……).我明白为了统一处理它们,我必须使用指向基类的指针,所以这里的类型为A *的变量.

在下面的示例中,我想填充aa类型为vector< A *>在功能f.由于我只能使用引用并且变量在f的末尾失去其范围,因此我无法再访问main中aa条目的成员.

什么可以解决这个问题?

#include <vector>
#include <iostream>


class A {
    public:
        virtual int getVar(int,int) = 0;
};

class B : public A {
    public:
        B(std::vector<std::vector<int> > var) : var_(var) {};
        int getVar(int i,int j) { return var_[i][j]; }
    private:
        std::vector<std::vector<int> > var_;
};

void f(std::vector<A*>& aa) {
    std::vector<std::vector<int> > var(1,std::vector<int>(1));
    var[0][0] = 42;

    B b(var);

    aa.push_back(&b);
}

int main() {
    std::vector<A*> aa;

    f(aa);

    std::cout << aa[0]->getVar(0,0) << std::endl;

    return 0;
}

解决方法

B b(var);
aa.push_back(&b);

它正在推送局部变量的地址.这就是问题的原因,因为局部变量在从functon返回时被破坏,但是仍然包含指向不存在的对象的指针.这样的指针被称为dangling pointer,使用它来调用未定义的行为 – 这是C中最危险和最令人不快的方面之一.

使用新的:

aa.push_back(new B(var));

现在它应该工作.

重要提示:不要忘记将?A()虚拟化:

class A {
    public:
        virtual ~A() {} //MUST DO IT
        virtual int getVar(int,int) = 0;
};

否则,您将无法使用基类型的指针删除派生类型的对象(以明确定义的方式).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读