C ++在数组元素中出现逻辑错误,而数组在构造函数中作为参数传递

时间:2013-05-24 09:51:12

标签: c++ arrays

问题是(参见输出),obj2元素看起来像在main方法和obj1中传递的obj2的并集。还有为什么obj1和obj2总是从1,2开始,无论什么不是。的,以及它们中存在的元素。我现在已经在这个问题上度过了整整一个晚上,它之前遇到了其他问题:In C++ program which passes array in constructor, execution stops无论这个问题多么微不足道。我将不胜感激任何帮助..请不要建议在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 obj1\n";
     obj1.printSet();  
     cout<<"\ninitial obj2\n";
     obj2.printSet(); 

    obj1.deleteEl(18);
    cout<<"\nafter deletion of 18 \n";
    obj1.printSet();
    obj1.insertEl(7);
    cout<<"\nafter insertion of 7\n";
    obj1.printSet();

    system("PAUSE");
    return EXIT_SUCCESS;
  }

 //here's the output

 ![output of program][1]


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

2 个答案:

答案 0 :(得分:1)

您正在将垃圾传递给构造函数,因为您的输入数组只包含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};

答案 1 :(得分:1)

最好不要使用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 ++中的数组名称只是一个原始指针。它不包含任何有关元素数量的信息。