C ++:灵活且能够存储多种数据类型的数组[关闭]
Posted
技术标签:
【中文标题】C ++:灵活且能够存储多种数据类型的数组[关闭]【英文标题】:C++: Array that flexible and able to store multiple data types [closed] 【发布时间】:2019-08-15 10:47:01 【问题描述】:我目前正在开发一个 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。
感谢任何答案。谢谢你。和平。
【问题讨论】:
重新开始,创建一个定义所有常见功能的基类,然后从基类派生类型差异。 当您使用调试器运行代码时,一次一行,检查所有变量的值,因为它们被您的程序更改,并观察程序的逻辑流程,观察结果你做?这正是调试器的用途,以确定您的程序实际执行的操作。了解并能够有效地使用调试器是每个 C++ 开发人员必备的技能。如果您不知道如何使用调试器,您应该借此机会学习如何使用调试器。std::variant
/std::any
被禁止了吗?
嗨@πάνταῥεῖ,实际上我不能使用 STL,因为这个库是为所有初学者准备的,而且很多初学者不了解 STL,所以他们只能在不知道它是如何工作的情况下使用它.
好的谢谢,我将使用 STL
【参考方案1】:
你的赋值运算符,
void operator=(ArrayDef value)
v.assign(value.v, tp);
tp = value.tp;
将value.v
分配给*this
具有的任何类型,然后才更改*this
的类型,可能会使数组处于不一致的状态。
这在您的情况下尤其糟糕,因为您的默认构造函数没有初始化 tp
,导致第一次分配时出现未定义的行为。
您需要转置这两行,或者v.assign(value.v, value.tp)
。
最好将类型跟踪移到联合中并使其私有。
或者,您知道,使用标准库并教您的学生以后会用到的东西,他们可以在他们的文献中了解更多。
【讨论】:
以上是关于C ++:灵活且能够存储多种数据类型的数组[关闭]的主要内容,如果未能解决你的问题,请参考以下文章