在C++中创建一个包含多种对象类型的列表,通常可以使用以下几种方法:
如果你有多个类,并且这些类可以共享一个共同的基类,你可以使用基类指针的容器来存储这些对象。
new
和delete
来管理对象的生命周期。#include <iostream>
#include <vector>
class Base {
public:
virtual void display() const = 0; // 纯虚函数
virtual ~Base() {} // 虚析构函数
};
class DerivedA : public Base {
public:
void display() const override {
std::cout << "DerivedA" << std::endl;
}
};
class DerivedB : public Base {
public:
void display() const override {
std::cout << "DerivedB" << std::endl;
}
};
int main() {
std::vector<Base*> objects;
objects.push_back(new DerivedA());
objects.push_back(new DerivedB());
for (const auto& obj : objects) {
obj->display();
}
// 清理内存
for (auto& obj : objects) {
delete obj;
}
return 0;
}
std::variant
C++17 引入了 std::variant
,它可以存储多种类型的值。
std::variant
可以在编译时确定其包含的类型。std::visit
来访问 variant
中的值。#include <iostream>
#include <vector>
#include <variant>
class A {
public:
void display() const { std::cout << "A" << std::endl; }
};
class B {
public:
void display() const { std::cout << "B" << std::endl; }
};
int main() {
std::vector<std::variant<A, B>> objects;
objects.push_back(A());
objects.push_back(B());
for (const auto& obj : objects) {
std::visit([](const auto& item) { item.display(); }, obj);
}
return 0;
}
std::any
std::any
是一个可以存储任意类型值的类。
#include <iostream>
#include <vector>
#include <any>
class A {
public:
void display() const { std::cout << "A" << std::endl; }
};
class B {
public:
void display() const { std::cout << "B" << std::endl; }
};
int main() {
std::vector<std::any> objects;
objects.push_back(A());
objects.push_back(B());
for (const auto& obj : objects) {
if (obj.type() == typeid(A)) {
std::any_cast<const A&>(obj).display();
} else if (obj.type() == typeid(B)) {
std::any_cast<const B&>(obj).display();
}
}
return 0;
}
选择哪种方法取决于你的具体需求:
希望这些信息对你有所帮助!
领取专属 10元无门槛券
手把手带您无忧上云