c++ - C++ 中的整数集

标签 c++ arrays class

我的作业有问题。任务是创建一个 IntegerSet IntegerSet 是一个包含 100 个元素的数组,表示从 0 到 99 的数字 例如,如果数字 5 出现在集合 a 中,则 a[5] = 1,空集合是零数组。

我创建了一个名为 IntegerSet 的类,这是 integerSet.cpp 中的代码

#include "integerset.h"
#include <iostream>
using std::cout;
using std::endl;

IntegerSet::IntegerSet(){
    int temp[100] = {0};
    set = temp;
}

IntegerSet::IntegerSet(int * setPtr) {
    set = setPtr;
}

void IntegerSet::insertElement(int toInsert) {
    if(toInsert < 100 && toInsert >= 0) {
        set[toInsert] = 1;
    }
}

void IntegerSet::deleteElement(int toDelete) {
    if (toDelete < 100 && toDelete >= 0 ) {
        set[toDelete] = 0;
    }
}

IntegerSet * IntegerSet::unionOfSets(IntegerSet * otherPtr) {
    int newSet[100] = {0};
    for(int i = 0; i < 100; i++ ) {
        if (this->set[i] == 1 || otherPtr->set[i] == 1) {
            newSet[i] = 1;
        }
    }
    return new IntegerSet(newSet);
}

IntegerSet * IntegerSet::intersectionOfSets(IntegerSet* otherPtr) {
    int newSet[100] = {0};
    for(int i = 0; i < 100 ; i++) {
        if(this->set[i] == 1 && otherPtr->set[i] == 1){
            newSet[i] = 1; 
        }
    }
    return new IntegerSet(newSet);
}

bool IntegerSet::isEmpty(){
    for(int i = 0 ; i < 100 ; i++) {
        if(set[i] == 1) {
            return false;
        }
    }
    return true;
}  

bool IntegerSet::isEqualTo(IntegerSet * otherPtr) {
    for(int i = 0; i < 100 ; i++) {
        if(this->set[i] != otherPtr->set[i]) {
            return false;                
        }        
    }
    return true;
}

void IntegerSet::printSet() {
    if(isEmpty()) {
        cout << "---" << endl;
    } else { 
        for(int i = 0; i < 100 ; i++) {
            if(set[i] == 1) {
                cout << i << ' ';
            }
        }
        cout << endl;        
    }
}   

IntegerSet::~IntegerSet() { 
    delete[] set;
}     

类有私有(private)成员int * set;

这是用来测试我的类的主要函数:

#include <iostream>
#include<new>
#include "integerset.h"

using std::cout;
using std::endl;

int main(int argc, char *argv[])
{
    IntegerSet * set1Ptr = new IntegerSet();
    set1Ptr->insertElement(1);
    set1Ptr->insertElement(2);
    set1Ptr->insertElement(3);
    set1Ptr->insertElement(50);
    IntegerSet * set2Ptr = new IntegerSet();
    set2Ptr->insertElement(0);
    set2Ptr->insertElement(3);
    set2Ptr->insertElement(2);
    set2Ptr->insertElement(51);
    set2Ptr->insertElement(100);
    set2Ptr->insertElement(99);
    IntegerSet * set3Ptr = set1Ptr->unionOfSets(set2Ptr);
    IntegerSet * set4Ptr = set1Ptr->intersectionOfSets(set2Ptr);
    cout << "First Set" << endl;
    set1Ptr->printSet();
    cout << "Second Set" << endl;
    set2Ptr->printSet();
    cout << "Equal ? : " << set1Ptr->isEqualTo(set2Ptr) << endl;
    cout << "Intersection : " << endl;
    set4Ptr->printSet();
    cout << "Union : " << endl;
    set3Ptr->printSet();
    system("PAUSE");
    return EXIT_SUCCESS;
}

这是我运行时得到的输出

First Set
16 19 35 45 46 54 66 84
Second Set
0 1 10 12 13 14 19 35 45 46 54 66 84
Equal ? : 1
Intersection :
16 19 35 45 46 54 66 84 98
Union :
0 1 10 12 13 14 19 35 45 46 54 66 84 98

我尝试了追踪,但我不知道出了什么问题,所以非常感谢您的帮助。

最佳答案

IntegerSet::IntegerSet(){
   int temp[100] = {0};
   set = temp;
}

这是创建一个包含 100 个元素的本地数组,并将指向它的指针存储在成员 set 中。这里的问题是 temp 的生命周期仅限于构造函数,一旦构造函数退出,数组就会被销毁,你所拥有的是一个悬空指针(指向一 block 内存的指针那是无效的)。

如果您需要使用指针,那么您应该动态分配内存并确保在析构函数中释放它。如果不是,您可以将数组声明为您的类型的成员属性并完全避免使用指针。

关于c++ - C++ 中的整数集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10238742/

相关文章:

java - 比较单独二维数组中的两个数组

arrays - 数组 "view"可能在不同类型的数组上吗?

c# - 从 aspx 页面上的按钮调用类

python - 如何从类主体中获取对当前类的引用?

c++ - 获取图像上特定位置的对象点云

c++ - 从 C/C++ 程序读取管道的最快方法?

c++ - 错误 : no matching function for call to 'Subclass::...'

java - 向按频率排序的数组中插入一个元素,然后再次按频率对数组进行排序

c++ - 理解函数错误的模糊新声明

c++ - 成员(member)使用无效(您是否忘记了“&”?)