【问题标题】:Print value in array using template class-c++使用模板类-c ++在数组中打印值
【发布时间】:2017-01-22 21:19:52
【问题描述】:

嗨,我正在尝试为一个类制作一个模板以打印出数组中的值。

#include<iostream>
using namespace std;

template <typename T>
class Array{
   public:
      Array(T array[], int arraysize){
         size=arraysize;
         _array=new T[size];
      }

      ~Array(){
         delete[] _array;
      }
      void print(){
         for(int i=0; i<size; i++){
            cout<<_array[i]<<' ';
         }
      }
      private:
         T *_array;
         int size;
};

int main(){
   int array1[5]={1,2,3,4,5};
   Array<int> a(array1,5);
   a.print();

   float array2[5]={1.012, 2.324, 3.141, 4.221, 5.327};
   Array<float> b(array2,5);
   b.print();

   string array3[]={"Ch1","Ch2","Ch3","Ch4","Ch5"};
   Array<string> c(array3,5);
   c.print();

   return 0;

}

这是代码,我想知道出了什么问题,因为它会打印出随机数。

【问题讨论】:

    标签: c++ arrays class templates


    【解决方案1】:

    你的构造函数:

    Array(T array[], int arraysize){
         size=arraysize;
         _array=new T[size];
    }
    

    您所做的只是分配数组的大小并分配内存,而无需实际复制内容。所以你看到的都是 POD 类型的随机值,以及类类型的默认构造值。

    您应该使用std::copy 进行复制

    Array(T array[], int arraysize) 
         : _array(new T[arraysize]), size(arraysize)
    {
        std::copy(array, array+arraysize, _array);
    }
    

    如你所见,我使用了member initailizer list;请记住Rule of 5。另外,我建议您改用std::unique_ptr

    【讨论】:

      【解决方案2】:

      代码使用new 创建模板的类成员_array,但没有将其初始化为任何内容,这就是您打印出随机垃圾的原因。

      构造函数确实接收到一个参数array,并使用该参数传递了一个初始化的数组。但是,构造函数完全忽略了该参数,并且没有对其进行任何处理。

      显然,您的意图是将模板构造函数接收的数组内容作为参数复制到_array。但是那个代码不见了。

      array 参数的内容不会自行复制到_array。你必须编写代码才能做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-04
        • 1970-01-01
        • 2021-11-11
        • 2010-11-30
        • 2021-12-20
        • 2013-07-21
        相关资源
        最近更新 更多