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];
    
;

我创建了存储单一类型的 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 【参考方案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 ++:灵活且能够存储多种数据类型的数组[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

(C/C++)区别:数组与指针,指针与引用

Python扩展包

R语言变量的定义

Java中的集合类

集合与数组比较

测试中c平台是啥东西