当数组作为参数传递给构造函数时,数组元素出现逻辑错误

C ++ Logic error in elements of array, while array passed as argument in constructor

本文关键字:数组元素 错误 数组 参数传递 构造函数      更新时间:2023-10-16

问题是(参见输出),obj2元素看起来像在main方法中传递的obj2和obj1的并集。还有,为什么obj1和obj2总是以1和2开头。它们的性质和所包含的元素。我现在已经花了一整个晚上在这个问题上,它以前有其他问题:在c++程序中,传递数组在构造函数中,执行停止,无论这个问题对你来说多么微不足道。我将感激任何帮助……而不是建议复杂而有效的解决方案,可在库的c++,请尝试建议哪里我错了作为一个新手:/

衷心感谢!

 //partial "integerset.h"
 class IntegerSet{
  public :
         IntegerSet( int [] );
         void insertEl(int);
         void deleteEl(int); //delete is a keyword, can't be identifier
         void printSet();
  private :
         int setArr[20];//no.s can be 1 to 20            
 };
 //partial "integerset.cpp"
 //libraries included
IntegerSet :: IntegerSet( int arr[] ){ 
       for(int i = 0; i < 20; i++)
               setArr[i] = 0; //for consistent data at start,avoid garbage
       for( int i = 0; i < 20; i++){
            if ( arr[i] >= 1 && arr[i] <= 20)
               this->insertEl(arr[i]);           
       }
}
void IntegerSet :: insertEl(int item){
            if ( setArr[item-1] != 1) //-1 so that 5 is checked at 4th position, etc.
                setArr[item-1] = 1; //set 4th array element to 1 if item = 5 
 }
void IntegerSet :: deleteEl(int item){ //delete is a keyword, can't be identifier
            if ( setArr[item-1] != 0 )
               setArr[item-1] = 0;
}
void IntegerSet :: printSet(){
    for ( int i = 0; i < 20; i++){
          if( this->setArr[i] == 1) 
                cout<<i+1<<" "; // + 1 important so that 2 displayed at 1st position
    }
}
   //partial "main.cpp"

  int main(){
      int a[] = {9,10,15,18,19};
      int b[] = {1,3,12,14,15};
      IntegerSet obj1(a);   
      IntegerSet obj2(b);
      cout<<"nintial obj1n";
     obj1.printSet();  
     cout<<"ninitial obj2n";
     obj2.printSet(); 
    obj1.deleteEl(18);
    cout<<"nafter deletion of 18 n";
    obj1.printSet();
    obj1.insertEl(7);
    cout<<"nafter insertion of 7n";
    obj1.printSet();
    system("PAUSE");
    return EXIT_SUCCESS;
  }
 //here's the output
 ![output of program][1]

  http://tinypic.com/view.php?pic=25uiceo&s=5

您正在向构造函数传递垃圾,因为您的输入数组只包含5个元素,但您将它们作为包含20个元素的索引。

改变:

 int a[] = {9,10,15,18,19};
 int b[] = {1,3,12,14,15};

:

 int a[20] = {9,10,15,18,19};
 int b[20] = {1,3,12,14,15};

请注意,未显式初始化的元素将包含0,因此现在相当于:

 int a[20] = {9,10,15,18,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 int b[20] = {1,3,12,14,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

最好不要使用像20这样神奇的数字。作为构造函数参数传递,并作为类成员存储。

IntegerSet::IntegerSet( unsigned n, int data[] );

或者例如:

IntegerSet::IntegerSet( std::vector<int> &data );

如果用int[20]初始化对象很重要,则传递int[20]:

int a[20] = {9,10,15,18,19};
IntegerSet obj1(a);

请记住,C/c++中的数组名称只是一个原始指针。它不包含任何关于元素数量的信息