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; }; 否则,您将无法使用基类型的指针删除派生类型的对象(以明确定义的方式). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |