我试图找到一种好方法在一个向量中存储两个不同的类对象,每个对象在向量中有自己的位置,因此可以在需要时存储和访问对象.
我使用了一个结构,但后来我将结构所有的东西存储到矢量中,这不是我想要的,我将举例说明我的意思.
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)
有没有办法我可以在一个对象中存储两个不同的类对象,但一次只传递一个以便存储,所以我在向量中有自己的索引?
如果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 是存储多个不能使用继承的不同类型的方法.