[英]Storing various types in a vector
I'm trying to store various different types of data in an array or vector. 我试图在数组或向量中存储各种不同类型的数据。 So far I'm doing this by using a base class that will be stored in the vector as pointers to each object and then type casting to get the data back. 到目前为止,我通过使用一个基类来实现这一点,该基类将作为指向每个对象的指针存储在向量中,然后键入强制转换以获取数据。 This works great for int, but any other type of data throws a access violation exception. 这适用于int,但任何其他类型的数据都会引发访问冲突异常。
Sorry if my explanation isn't very good, here is my code with comments that I hope will help: 对不起,如果我的解释不是很好,这是我的代码和评论,我希望将有所帮助:
//Base class
class MenuProperty
{
private:
std::string Name;
public:
MenuProperty(std::string Name) : Name(Name) {};
~MenuProperty() {};
std::string GetName();
};
//Typed class used to store data
template<class T>
class TMenuProperty : public MenuProperty
{
private:
T Data;
public:
TMenuProperty(std::string Name, T Data) : MenuProperty(Name), Data(Data) {};
T GetData()
{
return this->Data;
}
};
//Class with no type and data pointer to retrieve data
class cpMenuProperty : public MenuProperty
{
private:
VOID* Data;
public:
cpMenuProperty(std::string Name) : MenuProperty(Name) {};
VOID* GetPointer()
{
return this->Data;
}
};
Hope that makes some semblance of sense, here is my test code: 希望有一些相似之处,这是我的测试代码:
int main()
{
TMenuProperty<double> fP("Test2", 33.7354); //Create instance of property
MenuProperty* fMP = &fP; //Make a pointer to the object
cpMenuProperty* Test; //Make a pointer to the retrieving
//object
std::vector<MenuProperty*> Vec;
std::vector<MenuProperty*>::iterator it;
Vec.push_back(fMP);
it = Vec.begin();
Test = static_cast<cpMenuProperty*>(*it); //Cast the first object in the list
//list to the same type as the
//retrieveing object
double Data = *(double*)Test->GetPointer(); //Dereference and access, this is
//where the exception is thrown
std::cout << Data;
int Ret;
std::cin >> Ret;
}
I'm probably making some monumental error here, but thank you for taking the time to read it thus far :) Any help is appreciated, and constructive criticism too! 我可能在这里犯了一些巨大的错误,但是感谢你花时间阅读它到目前为止:)任何帮助都是值得赞赏的,也是建设性的批评!
You're initializing a TMenuProperty object on the stack, which you're then casting to a cpMenuProperty. 您正在初始化堆栈上的TMenuProperty对象,然后将其转换为cpMenuProperty。 There is never any memory allocated for the void* Data in the cpMenuProperty. 永远不会为cpMenuProperty中的void * Data分配任何内存。 There is no relationship between TMenuProperty and cpMenuProperty, except that they're derived from the same class. TMenuProperty和cpMenuProperty之间没有任何关系,除了它们来自同一个类。 This design is never going to work. 这种设计永远不会起作用。
#include<iostream>
#include<vector>
#include<iterator>
#include<memory>
class base {
public:
virtual void foo(){
std::cout << "in base" << std::endl;
}
};
class derived : public base {
public:
virtual void foo(){
std::cout << "in derived" << std::endl;
}
};
int main()
{
std::vector<std::unique_ptr<base>> vec;
vec.emplace_back(new derived);
static_cast<derived*>(vec[0].get())->foo();
return 0;
}
classic example, using modern practices. 经典的例子,使用现代实践。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.