【问题标题】:C++: Array that flexible and able to store multiple data types [closed]C ++:灵活且能够存储多种数据类型的数组[关闭]
【发布时间】: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];
    }
};

我创建了存储单一类型的 CharInt 类(我这样做是为了在我的库中模拟类)。

我还创建了能够存储CharInt 类类型的主要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

标签: c++ class oop object


【解决方案1】:

你的赋值运算符,

    void operator=(ArrayDef value)
    {
        v.assign(value.v, tp);
        tp = value.tp;
    }

value.v 分配给*this 具有的任何类型,然后才更改*this 的类型,可能会使数组处于不一致的状态。
这在您的情况下尤其糟糕,因为您的默认构造函数没有初始化 tp,导致第一次分配时出现未定义的行为。
您需要转置这两行,或者v.assign(value.v, value.tp)

最好将类型跟踪移到联合中并使其私有。

或者,您知道,使用标准库并教您的学生以后会用到的东西,他们可以在他们的文献中了解更多。

【讨论】:

    猜你喜欢
    • 2021-03-06
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多