数组的数组类打印输出

时间:2018-10-18 05:25:01

标签: c++ arrays

我试图创建一个成员函数,该成员函数打印出我控制的数组,但是我遇到了Seg错误。任何帮助都将非常有用!

这是我的头文件,其中的所有代码都可以工作,最后一个成员函数除外。

#include <iostream>
#include <assert.h>

using namespace std;
#ifndef _ARRAY_H
#define _ARRAY_H

template<class T>
class Array{
  private:
    T *a;
    int length;
  public:
    // constructor
    Array (int len){
      length = len;
      a = new T[length];
      for (int i = 0; i < len; i++){
        a[i]=0;
      }
    }
    // destructor
    ~Array()
      {delete[] a;}
    // operator overload
    T& operator [](int i){
      assert (i>=0 && i < length);
      return a[i];
    }

    // operator overload
    Array<T>& operator=(Array<T> &b){
      if (a !=nullptr) delete[] a;
      a = b.a;
      b.a = nullptr;
      length = b.length;
      return *this;
    }

    //get the length of the array
    int arraylength(){
      return length;
    }
//------------------This below is where I am having issue --------//
    //print out the array
    Array<T> printarray(){
      for (int i = 0; i < length; i++){
        cout << a[i];
      }
    }
};
int main();
#endif

这是我的主文件

#include <iostream>
#include "../include/array.h"

using namespace std;

int main(){

  // initialize array
  Array <int> a(5);
  Array <int> b(5);

  // put stuff into array
  for (int i = 0; i< a.arraylength(); i++){
    a[i] = i;
  }
  // set b = a using operator overload
  b = a;

  // print out the result b array
  for (int i = 0; i < b.arraylength(); i++){
    cout << b[i] << endl;
  }
  a.printarray();
  return 0;
}

再次。谢谢您的帮助,我对C ++还是陌生的,而且大多是自学成才。

2 个答案:

答案 0 :(得分:1)

您应该通过将返回类型更改为printarray并将其设为void成员函数来修复const

void printarray() const {
   for (int i = 0; i < length; i++){
      cout << a[i];
   }
}

但是,这不是代码中的主要问题。主要问题是您没有遵循The Rule of Three

  1. 您没有复制构造函数。
  2. 您有一个副本分配运算符,但未正确实施。

b = a;

引起下游问题,可以通过遵循“三个规则”来解决。

这是应该有效的副本分配运算符功能的实现。

// Make the RHS of the operator a const object.
Array<T>& operator=(Array<T> const& b)
{
   // Prevent self assignment.
   // Do the real assignment only when the objects are different.
   if ( this != &b )
   {
      if (a != nullptr)
      {
         delete[] a;
         a = nullptr;
      }

      // This is not appropriate.
      // a = b.a;
      // b.a = nullptr;

      // b needs to be left untouched.
      // Memory needs to be allocated for this->a.
      length = b.length;
      if ( length > 0 )
      {
         a = new T[length];

         // Copy values from b to this.
         for (int i = 0; i < length; ++i )
         {
            a[i] = b.a[i];
         }
      }
   }
   return *this;
}

请注意,您还应该实现复制构造函数,然后使用复制交换惯用语来实现赋值运算符。

非常相关:What is the copy-and-swap idiom?

答案 1 :(得分:1)

在此声明中

  b = a;

您调用了operator=,其中a对象的a指针被设置为 nullptr ,但是在 printArray 中却没有不检查a是否不为空,因此您要为空指针访问数据,这是未定义的行为。添加条件以检查数组是否为空:

void printarray(){
      if (!a) return;  // <- array is empty
      for (int i = 0; i < length; i++){
        cout << a[i];
      }
    }

第二, printArray 的返回类型应该为void,在此函数中您不返回任何值。