C++:灵活且能够存储多种数据类型的数组
C++: Array that flexible and able to store multiple data types
我目前正在开发一个C++库,我正在制作一个数组类,它就像向量一样,能够存储多种类型的数据。但是,我遇到了一些问题并试图解决它们,但我失败了。我缩短了代码,使其更易于查看和理解。
下面是我的代码:
class Char
{
public:
Char()
{
}
Char(char value)
{
v = value;
}
Char(Char& value)
{
v = value.val();
}
char val()
{
return v;
}
private:
char v;
};
class Int
{
public:
Int()
{
}
Int(int value)
{
v = value;
}
Int(Int& value)
{
v = value.val();
}
int val()
{
return v;
}
private:
int v;
};
class Array
{
private:
class ArrayDef
{
private:
enum class Types
{
Char,
Int
};
union ArrayTypes {
public:
Char CharV;
Int IntV;
ArrayTypes()
{
}
ArrayTypes(Char value)
: CharV(value)
{
}
ArrayTypes(Int value)
: IntV(value)
{
}
~ArrayTypes()
{
}
void assign(const ArrayTypes& value, const Array::ArrayDef::Types& type)
{
if (type == Types::Char)
CharV = value.CharV;
else if (type == Types::Int)
IntV = value.IntV;
}
};
public:
mutable Types tp;
mutable ArrayTypes v;
ArrayDef()
{
}
ArrayDef(const ArrayDef& value)
{
v.assign(value.v, value.tp);
tp = value.tp;
}
ArrayDef(Char value)
{
v.assign(value, Types::Char);
tp = Types::Char;
}
ArrayDef(Int value)
{
v.assign(value, Types::Int);
tp = Types::Int;
}
Char getChar()
{
if (tp != Types::Char)
throw(-1);
return v.CharV;
}
Int getInt() const
{
if (tp != Types::Int)
throw(-1);
return v.IntV;
}
void operator=(ArrayDef value)
{
v.assign(value.v, tp);
tp = value.tp;
}
};
mutable ArrayDef* v;
mutable int l = 0;
public:
Array()
{
}
~Array()
{
delete[] v;
}
int len() const
{
return l;
}
void add(const ArrayDef& value)
{
ArrayDef* temp = new ArrayDef[l + 1];
for (int i = 0; i < l; i++)
temp[i] = v[i];
l++;
v = temp;
v[l - 1] = value;
}
ArrayDef operator[](int value)
{
return v[value];
}
};
我创建了存储单个类型的Char
和Int
类(我这样做是为了模拟库中的类(。
我还创建了能够存储Char
和Int
类类型的主Array
类。类ArrayDef
中还有一个联合ArrayTypes
,位于Array
类的专用访问说明符下方。
以下是我的驱动程序代码:
int main()
{
Int i(100);
Char c('a');
Array arr;
arr.add(i);
arr.add(c);
std::cout << arr[0].getInt().val() << std::endl;
std::cout << arr[1].getChar().val() << std::endl;
}
输出的第一行错误,但输出的第二行正确。为什么会发生这种情况以及如何解决它?
由于一些技术问题,我无法使用 STL。
任何答案都值得赞赏。谢谢。和平。
您的赋值运算符,
void operator=(ArrayDef value)
{
v.assign(value.v, tp);
tp = value.tp;
}
将value.v
分配给*this
具有的任何类型,然后才更改*this
的类型,可能会使数组处于不一致的状态。
这在您的情况下尤其糟糕,因为您的默认构造函数不会初始化tp
,导致第一次赋值时出现未定义的行为。
您需要转置这两行,或者v.assign(value.v, value.tp)
.
更好的方法是将类型跟踪移动到联合中并使其成为私有。
或者,你知道,使用标准库并教授你的学生以后会用到的东西,他们可以在他们的文献中学到更多。
相关文章:
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 类型数组?
- 如何在使用 make_unique<T[]>() 制作的模板类型数组上使用 std::fill?
- 将基本类型数组中的内存重新用于不同(但仍然是基本)类型的数组合法吗
- 错误的值是使用c++从CSV文件数据写入数组
- 在C++中返回基元类型数组(Java比较)
- c++用输入数据创建数组
- 如何返回 QVariant 类型数组
- 如何在本机 c++ jni 中实现 java 类型数组
- 模板类型数组的模板类型数组
- 如何将数据从数组复制到C++特征矩阵或向量
- 如何确定未知类型数组的索引是否为空
- 复杂类型数组的静态初始化
- 如何在C 中的派生类中分配数据成员数组
- 访问基类型数组成员(Int-to-type习惯用法)
- 如何将 char 类型数组传递给函数并将第一个字符数组复制到第二个图表数组并使用 c++ 进行比较
- 如何在 c++ 中从对象数组中获取数据成员数组
- 如何在C 中制作结构类型数组
- c++我需要将文件中的数据读取到多维数组中,然后用一种数据类型对数组进行排序.怎样
- 在结构中创建未知数据类型数组