一个指针,c ++中的两个不同的类

Yot*_*tam 7 c++ pointers class

假设我有两个结构ab,分别持有其几个变量(大多数变量是C++的核心类型,但不是全部).

有没有办法创建c一个可以指向其中任何一个的命名指针?或者,有没有办法创建一个可以容纳其中任何一个的集合?

谢谢

Ale*_*tov 5

或者,有没有办法创建一个可以容纳其中任何一个的集合?

看一下Boost.AnyBoost.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使其能够在不重新编译的情况下保存新的意外类型则不然。


Bjö*_*lex 5

创建可以指向两者之一的指针的通常方法是使它们从公共基类继承。基类的任何指针都可以指向任何子类。请注意,通过这种方式,您只能通过该指针访问属于基类的元素:

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)