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

C++ C++;数组元素中的逻辑错误,而数组在构造函数中作为参数传递,c++,arrays,C++,Arrays,问题是(参见输出),obj2元素看起来像是在main方法和obj1中传递的obj2的并集。另外,为什么obj1和obj2总是以1,2开头,而不管数量和元素是什么。我现在花了整整一个晚上讨论这个问题,以前它还有其他问题:不管这个问题在你们看来多么琐碎。我很感激任何帮助…请……而不是提出复杂的,但有效的解决方案在图书馆的C++,请尝试建议我哪里错了作为新手:/< /P> 期待中的感谢 //partial "integerset.h" class IntegerSet{ public :

问题是(参见输出),obj2元素看起来像是在main方法和obj1中传递的obj2的并集。另外,为什么obj1和obj2总是以1,2开头,而不管数量和元素是什么。我现在花了整整一个晚上讨论这个问题,以前它还有其他问题:不管这个问题在你们看来多么琐碎。我很感激任何帮助…请……而不是提出复杂的,但有效的解决方案在图书馆的C++,请尝试建议我哪里错了作为新手:/< /P> 期待中的感谢

 //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
//部分“integerset.h”
类整数集{
公众:
整数集(int[]);
无效插入(int);
void deleteEl(int);//delete是关键字,不能是标识符
void printSet();
私人:
int setArr[20];//编号s可以是1到20
};
//部分“整数集cpp”
//图书馆包括
整数集::整数集(int-arr[]){
对于(int i=0;i<20;i++)
setArr[i]=0;//要在开始时获得一致的数据,请避免垃圾
对于(int i=0;i<20;i++){
如果(arr[i]>=1&&arr[i]insertEl(arr[i]);
}
}
void IntegerSet::insertEl(int项){
如果(设置arr[项目1]!=1)/-1,则在第4位检查5,以此类推。
setArr[item-1]=1;//如果item=5,则将第4个数组元素设置为1
}
void IntegerSet::deleteEl(int item){//delete是关键字,不能是标识符
如果(setArr[项目1]!=0)
setArr[第1项]=0;
}
void IntegerSet::printSet(){
对于(int i=0;i<20;i++){
如果(此->设置阵列[i]==1)

cout您正在将垃圾传递给构造函数,因为您的输入数组只包含5个元素,而您正在对它们进行索引,就好像它们包含20个元素一样

更改:

 int a[] = {9,10,15,18,19};
 int b[] = {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 );

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

哦,是的!为什么我不在几个小时前提出这个问题?请您提供一些关于数组初始化的更多解释或有用的链接。非常感谢!现在是讨论这个问题的好时机学会使用调试器——如果你已经在调试器中通过了构造函数,你会立刻看到问题,而且它会被更快地修复。可能是我没有做的事情是正确的,但是我的DEV C++ IDE调试器对于单个文件来说是很好的。这是一个项目(控制台应用程序)它说:“在没有任何事情发生之后,下次点击调试时,同样的事情就会发生……TIS对话框出现N次!@ SyVANIDHANK,如果你的编译器是GNU或类似的(可能是任何DEV C++使用的不是MSVC),请确保”-G”。编译命令和链接命令上都有标志;这会生成调试信息,但重要的是它必须位于链接和编译命令上(对于需要符号信息的源)。
IntegerSet::IntegerSet( std::vector<int> &data );
int a[20] = {9,10,15,18,19};
IntegerSet obj1(a);