Yot*_*tam 7 c++ pointers class
假设我有两个结构a和b,分别持有其几个变量(大多数变量是C++的核心类型,但不是全部).
有没有办法创建c一个可以指向其中任何一个的命名指针?或者,有没有办法创建一个可以容纳其中任何一个的集合?
谢谢
或者,有没有办法创建一个可以容纳其中任何一个的集合?
看一下Boost.Any和Boost.Variant。如果你只有 2 节课,那么variant就足够了。如果您计划其他类型,并且不想重新编译此“集”,则使用any.
any然后使用 或的任何容器variant。
#include <boost/any.hpp>
#include <boost/variant.hpp>
#include <vector>
class A { };
class B { };
class C { };
int main()
{
// any
std::vector<boost::any> anies;
anies.push_back(A());
anies.push_back(B());
A a0 = boost::any_cast<A>(anies[0]);
A b0 = boost::any_cast<A>(anies[1]); // throws boost::bad_any_cast
// variant
std::vector<boost::variant<A,B> > vars;
vars.push_back(A());
vars.push_back(B());
A a1 = boost::get<A>(vars[0]);
A b1 = boost::get<A>(vars[1]); // throws boost::bad_get
// and here is the main difference:
anies.push_back(C()); // OK
vars.push_back(C()); // compile error
}
Run Code Online (Sandbox Code Playgroud)
编辑:当然也可以有两个以上的课程variant。但扩展variant使其能够在不重新编译的情况下保存新的意外类型则不然。
创建可以指向两者之一的指针的通常方法是使它们从公共基类继承。基类的任何指针都可以指向任何子类。请注意,通过这种方式,您只能通过该指针访问属于基类的元素:
class Base {
public:
int a;
};
class Sub1 : public Base {
public:
int b;
};
class Sub2 : public Base {
public:
int c;
};
int main() {
Base* p = new Sub1;
p.a = 1; // legal
p.b = 1; // illegal, cannot access members of sub-class
p = new Sub2; // can point to any subclass
}
Run Code Online (Sandbox Code Playgroud)
您试图实现的目标称为多态,它是面向对象编程的基本概念之一。访问子类成员的一种方法是向下转换指针。执行此操作时,必须确保将其转换为正确的类型:
static_cast<Sub1*>(p).b = 1; // legal, p actually points to a Sub1
static_cast<Sub2*>(p).c = 1; // illegal, p actually points to a Sub1
Run Code Online (Sandbox Code Playgroud)
至于第二个问题,使用上述技术,您可以创建一组指向基类的指针,然后这些基类可以保存任何子类的实例(也可以混合使用):
std::set<Base*> base_set;
base_set.insert(new Sub1);
base_set.insert(new Sub2);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7240 次 |
| 最近记录: |