复制构造函数未从类对象获取数组大小

用户名

我有一个采用数组及其大小的类。在类中,我有一个索引运算符“ []”,该运算符已重载以将其内容传递给类成员函数并返回该函数。它还会检查我是否正在访问超出数组大小的内容。

     this_type operator[] (int index)  
    {
        assert (index > 0 && index<=len);
        at(index);
        return c_arr()[index];
    }

我为此制作了一个复制构造函数

   //constructor
    my_array(this_type const arr[], int size)
    {
    len = size;
    assert(arr != NULL);
    assert(size >= 0);

    this->arr = new this_type[size];
    for (int i = 0; i < size; i++)
        (*this).arr[i] = arr[i];
    }
    //copy constructor
    my_array( const my_array<this_type>  & arr)
    {
    this->arr = new this_type[sizeof(arr)];
    memcpy(this->arr, arr.arr, sizeof(this_type)*arr.len);
    }
    my_array(int size)
    {
    len = size;
    assert(size >= 0);

    this->arr = new this_type[size];
    }

但是,当调用成员函数“ len”时,似乎没有传递数组大小值。有什么想法吗?

    #include <iostream>
    #include <cassert>
    #include <assert.h>
    using namespace std;

    template <class this_type> 
    class my_array
    {
    private:
    this_type *arr;
    int len;

    int sum()
    {
        int sum;
        for (int i = 0; i < len; i++)
            sum += arr[i];
    }

    public:


    int size() const
    {
    return len;
    }

    this_type &at(int index)
    {
    assert( index >= 0 && index < len);
    return arr[index];
    }

    my_array(this_type const arr[], int size)
    {
    len = size;
    assert(arr != NULL);
    assert(size >= 0);

    this->arr = new this_type[size];
    for (int i = 0; i < size; i++)
        (*this).arr[i] = arr[i];
    }
    my_array( const my_array<this_type>  & arr)
    {
    this->arr = new this_type[sizeof(arr)];
    memcpy(this->arr, arr.arr, sizeof(this_type)*arr.len);
    }
    my_array(int size)
    {
    len = size;
    assert(size >= 0);

    this->arr = new this_type[size];
    }
    ~my_array()
    {
    delete[] arr;
    }

    this_type* c_arr()
    {
        return arr;
    }

     this_type & operator[] (int index)
        {
        assert (index > 0 && index<=len);
         at(index);
         return c_arr()[index];
    }

     this_type operator[] (int index)  
    {
        assert (index > 0 && index<=len);
        at(index);
        return c_arr()[index];
    }
    friend istream & operator>>(istream &lhs, my_array<this_type> &rhs);

    friend ostream & operator<<(ostream &lhs, my_array<this_type> &rhs);
    };
    template <class this_type> 
    ostream & operator<<(ostream &lhs, my_array<this_type>&rhs)
    {
    for ( int i = 0; i < rhs.size(); i++)
        lhs << rhs.arr[i] << endl;
    return lhs;
    }
    template <class this_type> 
    istream & operator>>(istream &lhs, my_array<this_type> &rhs)
    {
    for ( int i = 0; i < rhs.size(); i++)
        lhs >> rhs.arr[i];
    return lhs;
    }




    int main()
    {
    char arra[5]={'c','o','d','e','s'};

    my_array<char> arr(arra,5), arr1(5), arr2(arr);
       for(int t=0;t< 9;t++)
      {
       //use the operator that is attached to the class instance
        cout << arr2[t];

   }
    for(int t=0;t< 9;t++)
    {
    cout<<arr2.c_arr()[t];
    }
    return 0;
    }
本杰明·林德利(Benjamin Lindley)
this->arr = new this_type[sizeof(arr)];

复制构造函数中的这一行是不正确的。arr是您my_array班上的一个对象sizeof(arr)是一个编译时间常数,并且完全独立于为数组分配的元素数量。这些元素甚至都没有包含在类中。它们在免费商店中,并且该类持有指向它们的指针。您想要的是:

this->arr = new this_type[arr.len];

您还希望将其分配给正在构造的对象的len成员。

this->len = arr.len;

我不得不说,除非您出于学习目的而创建此类,否则请使用std::vector

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

深度复制构造函数数组类C ++

来自分类Dev

在类内部创建数组,其大小由构造函数决定

来自分类Dev

复制模板类的构造函数

来自分类Dev

模板类的复制构造函数

来自分类Dev

复制或移动具有成员std :: mutex(或其他不可复制对象)的类的构造函数?

来自分类Dev

删除类的复制构造函数时,初始化类的数组成员

来自分类Dev

类对象数组的构造方法

来自分类Dev

C ++ 14函数将返回对象数组,尽管复制构造函数已删除

来自分类Dev

C ++ 14函数将返回对象数组,尽管复制构造函数已删除

来自分类Dev

对象数组副本构造函数

来自分类Dev

来自基类的复制构造函数

来自分类Dev

模板类复制构造函数未调用

来自分类Dev

模拟复制构造函数的C ++类

来自分类Dev

C++ 类对象复制构造函数和运算符=

来自分类Dev

复制构造函数返回临时对象

来自分类Dev

复制临时对象的构造函数调用

来自分类Dev

使用复制构造函数创建的对象的寿命

来自分类Dev

在constexpr构造函数中复制数组

来自分类Dev

在构造函数中复制静态数组

来自分类Dev

一类的对象的静态数组在另一类/构造函数中

来自分类Dev

具有复制构造函数,平凡的赋值运算符和平凡的析构函数的动态大小的文本对象

来自分类Dev

C++ - 如何从具有常量大小的算术类型数组创建类构造函数?

来自分类Dev

数组大小作为构造函数参数

来自分类Dev

从函数参数获取数组的大小

来自分类Dev

为类编写复制构造函数会在删除析构函数中的对象时导致意外崩溃

来自分类Dev

复制其他对象值的复制构造函数

来自分类Dev

使用列表类的堆栈类的复制构造函数

来自分类Dev

类复制构造函数和指向成员的指针函数

来自分类Dev

Arduino / C ++:在类构造函数之外初始化对象的静态数组

Related 相关文章

  1. 1

    深度复制构造函数数组类C ++

  2. 2

    在类内部创建数组,其大小由构造函数决定

  3. 3

    复制模板类的构造函数

  4. 4

    模板类的复制构造函数

  5. 5

    复制或移动具有成员std :: mutex(或其他不可复制对象)的类的构造函数?

  6. 6

    删除类的复制构造函数时,初始化类的数组成员

  7. 7

    类对象数组的构造方法

  8. 8

    C ++ 14函数将返回对象数组,尽管复制构造函数已删除

  9. 9

    C ++ 14函数将返回对象数组,尽管复制构造函数已删除

  10. 10

    对象数组副本构造函数

  11. 11

    来自基类的复制构造函数

  12. 12

    模板类复制构造函数未调用

  13. 13

    模拟复制构造函数的C ++类

  14. 14

    C++ 类对象复制构造函数和运算符=

  15. 15

    复制构造函数返回临时对象

  16. 16

    复制临时对象的构造函数调用

  17. 17

    使用复制构造函数创建的对象的寿命

  18. 18

    在constexpr构造函数中复制数组

  19. 19

    在构造函数中复制静态数组

  20. 20

    一类的对象的静态数组在另一类/构造函数中

  21. 21

    具有复制构造函数,平凡的赋值运算符和平凡的析构函数的动态大小的文本对象

  22. 22

    C++ - 如何从具有常量大小的算术类型数组创建类构造函数?

  23. 23

    数组大小作为构造函数参数

  24. 24

    从函数参数获取数组的大小

  25. 25

    为类编写复制构造函数会在删除析构函数中的对象时导致意外崩溃

  26. 26

    复制其他对象值的复制构造函数

  27. 27

    使用列表类的堆栈类的复制构造函数

  28. 28

    类复制构造函数和指向成员的指针函数

  29. 29

    Arduino / C ++:在类构造函数之外初始化对象的静态数组

热门标签

归档