【发布时间】: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