在向量中存储两个不同的类对象

Jac*_*ack 2 c++ class vector

我试图找到一种好方法在一个向量中存储两个不同的类对象,每个对象在向量中有自己的位置,因此可以在需要时存储和访问对象.

我使用了一个结构,但后来我将结构所有的东西存储到矢量中,这不是我想要的,我将举例说明我的意思.

Class A{
   public:
     void changeNumber(int x) {number = x;}
   private:
     int number;
};

Class B{
   public:
     void changeNumber(int x) {number = x;}
   private:
     int number;
};

struct Object{
   A a;
   B b;
};

Class Main{
   public:
     void storeObject(Object ob) {object.push_back(ob);}
   private:
     std::vector<Object> objects; //when an object is passed both A and B objects are stored within the vector in the same location
};
Run Code Online (Sandbox Code Playgroud)

有没有办法我可以在一个对象中存储两个不同的类对象,但一次只传递一个以便存储,所以我在向量中有自己的索引?

Log*_*uff 7

如果A并且B具有通用函数并且您将仅在向量的元素上调用这些函数,则可以使用所有通用成员和成员函数并从中创建基类.然后make A和B派生类Object:

class Object
{
public:
    virtual ~Object() = default;

    void changeNumber(int x) { number = x; }

private:
    int number;
};

class A : public Object
{
    // extension of Object
};

class B : public Object
{
    // extension of Object
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,A没有什么不同B,所以一切都在实现Object.

最后,你的矢量看起来像这样:

std::vector<Object*> objects;
Run Code Online (Sandbox Code Playgroud)

这里是更优选的解决方案,std::shared_ptr在元素从向量中移除或以其他方式被破坏后,为您释放内存.

std::vector<std::shared_ptr<Object>> objects;
Run Code Online (Sandbox Code Playgroud)

存储对象:

void storeObject(std::shared_ptr<Object> const& ob)
{
    objects.push_back(ob);
}

// Example calls
Main main;
main.storeObject(std::make_shared<Object>(A())); // store A
main.storeObject(new A()); // logically same as above

main.storeObject(std::make_shared<Object>(B())); // store B
main.storeObject(new B());
Run Code Online (Sandbox Code Playgroud)

boost::variant 是存储多个不能使用继承的不同类型的方法.