3

我正在尝试为 Array 类重载运算符 << >> != == = 和 []。应用程序在运行时崩溃,但没有显示编译错误。什么可能是错的?IDE 使用 dev c++

这是array.h

#ifndef ARRAY_H
#define ARRAY_H

#include <iostream>
using namespace std;

class Array{
  friend ostream & operator << ( ostream &, const Array & );
  friend istream & operator >> ( istream &, Array &);
  private:
         int size;
         int * ptr;
  public:
         Array ( int = 10 );
         Array ( const Array & ); //copy constructor
         ~Array ();
         const Array &operator=( const Array & ); 
         bool operator == ( const Array & ) const; 
         bool operator != ( const Array & ) const;
         const int operator [] (int) const; 
         int getSize() const;            
};

#endif

现在 array.cpp

#include <iostream>
using namespace std;
#include "array.h"

Array::Array (int sze ){ //default constructor edited
         size = (sze > 0 ? sze : 10);
         ptr = new int [ size ];
         for (int i = 0;  i < size; i++)
             ptr[ i ] = 0; //initial values
}
Array::Array (const Array & arr ): size(arr.size){
         ptr = new int [size];
         for ( int i = 0; i< size; i++)
             ptr [ i ] = arr.ptr [ i ];
}
Array::~Array(){
         delete [] ptr;
}
const Array &Array :: operator= ( const Array & right){//IMPO
         if(&right != this){ //edited self assignment test
                   if(size != right.size){//diff sized arrays
                           delete [] ptr; //reclaim space
                           size = right.size; 
                           ptr = new int [ size ]; //space created
                   }
         }
         for(int i=0; i<size; i++)
                 ptr[ i ] = right.ptr[ i ];
         return *this;     //enables cascading a=b=c       
}
bool Array::operator == ( const Array & right) const{
         if ( size != right.size )
            return false;
         for ( int i =0; i < size; i++ ){
             if ( ptr [ i ] != right.ptr[ i ] )
                return false;
         }
         return true;
 }
bool Array::operator != ( const Array & right ) const{ //edited
         return ! (*this == right);
}
const int Array::operator [] (int subscript) const{
         if(subscript >=0 && subscript < size)
            return ptr[ subscript ];      
}
int Array::getSize() const{ return size; }  
//friend functions not in .h
ostream & operator << ( ostream & output, const Array & array){
         for (int i = 0; i < array.size; i++)
             output << array.ptr[i] ; 
}
istream & operator >> ( istream & input, Array & array){
         for (int i = 0; i < array.size; i++)
             input >> array.ptr[i];
}

现在 main.cpp

#include <cstdlib>
#include <iostream>
#include "array.h" // " " not <>
using namespace std;

int main(int argc, char *argv[])
{
Array a1(7),a2 (-1),a4; //changed a2
cout<<"Input "<<a1.getSize()<<" integers for Array object a1 and "<<a2.getSize()<<" integers for Array objecta2\n";
cin>>a1>>a2;
cout<<"a1 and a2 are\n";
cout<<a1<<endl<<a2;
cout<<"a1!=a2 : "<<(a1!=a2)<<endl;
cout<<"a1 ==a2: "<<(a1==a2)<<endl;
cout<<"Printing a1[5] : "<<a1[5]<<endl;
Array a3(a1); 
a4 = a3;

system("PAUSE");
return EXIT_SUCCESS;
}
4

3 回答 3

6

ptr您必须在构造函数中保留内存。

Array::Array (int size ){ //default constructor
         size = (size > 0 ? size : 10);
         ptr = new int [size]; // ADD THIS LINE
         for (int i = 0;  i < size; i++)
             ptr[ i ] = 0; //initial values
}

您的代码还有一些其他问题不是崩溃的直接来源,但值得注意:

  1. Array::operator !=是根据自身来定义的。它应该类似于operator==,或者您可以重新使用它

    if( *this == right )
        return false;
    return true;
    
  2. Array::operator []如果索引超出范围,应该可能会抛出异常。目前它只返回垃圾内存。

  3. 在分配内部Array::Array (int size )分配size给参数,而不是分配给成员。将第一行更改为:

     this->size = (size > 0 ? size : 10);
    
  4. operator<<并且operator>>应该分别返回outputinput

    ostream & operator << ( ostream & output, const Array & array){
       for (int i = 0; i < array.size; i++)
           output << array.ptr[i] ; 
       return output;
    }
    
于 2012-10-26T19:58:21.150 回答
1

您的默认构造函数中有 2 个错误:

1)您没有为它分配内存ptr并尝试对其进行初始化,这肯定是一个错误并导致未定义的行为,因此如果您有一些无效值,ptr您可能会遇到分段错误或更糟的是您可能会覆盖一些您的值内部变量!

size = (size > 0 ? size : 10);( _ size_ size_ size_例如,size可能7476327436肯定远远超出了您的阵列的末尾。

除此之外,您的 , 中有 1 个错误operator !=,因为您有if ( *this != right )并且将operator !=用于比较,这在所有情况下都是一个递归函数,您将获得堆栈溢出异常,因此如果您想检查确切的指针,请使用if ( this != right )而不是那。

我第一次看到你的代码时并没有完全检查它,但是你的代码中有一些其他错误,我什至不知道你是如何编译它的,在多个地方你没有为你的函数提供返回值。请记住永远不要忽略编译器警告,以帮助您纠正您的编程错误:

const int Array::operator [] (int subscript) const{
    if(subscript >=0 && subscript < size)
        return ptr[ subscript ];
    // If not what should I do?? add a return value here, this is a warning
    // since compiler think somehow you know that your code never reach here
    // but do you really know??
    return 0;
}
ostream & operator << ( ostream & output, const Array & array){
    for (int i = 0; i < array.size; i++)
        output << array.ptr[i] ;
    // You say that your function return an ostream& but where is it??
    // this is an error so compiler have nothing to return instead of you!
    // And if your compiler does not generate an error possibly it return 
    // junk value that will cause an error!!
    return output;
}
istream & operator >> ( istream & input, Array & array){
    for (int i = 0; i < array.size; i++)
        input >> array.ptr[i];
    // again you forget to return an istream& and again this is an error
    return input;
}

但除此之外,我在您的代码中没有看到任何错误,它应该可以正常运行

于 2012-10-26T20:25:22.340 回答
1

此外,您在执行operator !=at 行时遇到错误: if ( *this != right )- 递归定义,因此,堆栈溢出。

于 2012-10-26T20:10:48.907 回答