gpt4 book ai didi

c++ - 我怎样才能拥有一个具有不同参数类型的对象,同时它也在一个 vector 中?

转载 作者:行者123 更新时间:2023-11-30 01:06:36 27 4
gpt4 key购买 nike

我目前希望有一个对象 vector ,其中每个对象都有不同的属性。

预期结果:

//v is a vector
v.push_back(ttSaveObj(5, "int example"));
v.push_back(ttSaveObj("Hello, world!", "string example"));

std::cout << v[0].data << " " << v[0].variableName << std::endl; //Intended Output: 5 int example
std::cout << v[1].data << " " << v[1].variableName << std::endl; //Intended Output: Hello, world! string example

基于 this answer我尝试使用 <void*> 为类创建一个构造函数在模板中,但这似乎只是创建一个指向 void 的指针(正如我部分预期的那样)。

ttSaveObj.hpp:

template <typename T>
class ttSaveObj {
public:

ttSaveObj(T pVar, std::string pName) {
data = pVar;
variableName = pName;
};
~ttSaveObj() {};

std::string variableName;
T data;
};

ttGameObj.hpp:

#include "ttSaveObj.hpp"

class ttGameObj {
public:

ttGameObj();
~ttGameObj();
std::vector<ttSaveObj<void*>> data;
};

ttGameObj.cpp:

#include "ttGameObj.hpp"

ttGameObj::ttGameObj() {
int asdf = 5;
int * test = &asdf;
data.push_back(ttSaveObj<void*>(test, "X"));
std::cout << &data[0].data << " " << data[0].variableName << std::endl; //Output: 0x15fb770 X
}

任何能帮助我更接近我的预期结果的东西都会受到赞赏,谢谢!

最佳答案

您放入 vector 中的对象似乎有两个数据成员:variableName , 这是固定的 std::string类型,和一个 data字段,它是不同的类型。

您可以考虑使用 C++17's std::variant (或 Boost 的 variant 实现)对于 data field 。例如,如果您计划支持类型 int , floatstd::string为你的data , 你可以使用 std::variant<int, float, std::string> .

还有 std::any ,如果您想存储任何类型的实例(满足 std::any documentation 中描述的要求)。

现代 C++ 中,我建议避免使用 C 风格 void* ,并且仅在绝对必要时才使用它(例如,如果您处于某些遗留 C API 边界):有更安全、更健壮和更高级别的替代方案。


另一种选择(如果它对您的设计更有意义)是为要放入 vector 中的对象定义一个基类(接口(interface)),并定义实现此接口(interface)的自定义类.在这种情况下,我建议使用 smart 指针(例如 std::unique_ptrstd::shared_ptr )以简单安全的方式管理这些对象(我在这里看到另一个使用原始指针的答案,需要显式new/delete - 实际上在该代码中有 new 但没有 delete ,随之而来的是资源泄漏)。

例如:

#include <iostream>
#include <memory>
#include <string>
#include <vector>
using namespace std;

// Interface for an element to be inserted in the vector
class IElement
{
public:
IElement() {}
virtual ~IElement() {}

virtual string ToString() = 0;

// Other virtual methods ...
};

class IntElement : public IElement
{
public:
explicit IntElement(int n) : _n{ n } {}

virtual string ToString() override
{
return to_string(_n);
}

private:
int _n;
};

class StringElement : public IElement
{
public:
explicit StringElement(const string& s) : _s{ s } {}

virtual string ToString() override
{
return _s;
}

private:
string _s;
};

int main()
{
vector<shared_ptr<IElement>> elements;
elements.push_back(make_shared<IntElement>(10));
elements.push_back(make_shared<IntElement>(20));
elements.push_back(make_shared<StringElement>("Hello"));
elements.push_back(make_shared<StringElement>("World"));

for (const auto& e : elements)
{
cout << e->ToString() << '\n';
}
}

输出:

10
20
Hello
World

关于c++ - 我怎样才能拥有一个具有不同参数类型的对象,同时它也在一个 vector 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46202764/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com