3

割り当てに問題があります。割り当ては、IntegerSetを作成することです。IntegerSetは、0から99までの数値を表す100個の要素の配列です。たとえば、数値5がセットa thena[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;
}     

クラスにはプライベートメンバーがい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

トレースしてみましたが、何が悪いのかわかりませんので、よろしくお願いします。

4

2 に答える 2

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

これは、100個の要素のローカル配列を作成し、それへのポインターをメンバーに格納することsetです。ここでの問題は、の存続期間がtempコンストラクターに制限され、コンストラクターが終了するとすぐに配列が破棄され、ダングリングポインター(無効なメモリブロックへのポインター)が存在することです。

ポインタを使用する必要がある場合は、メモリを動的に割り当て、デストラクタで必ず解放する必要があります。そうでない場合は、配列を自分のタイプのメンバー属性として宣言し、ポインターを完全に回避できます。

于 2012-04-20T00:56:19.067 に答える
1

呼び出している「新しい」ごとに、削除する必要があることを忘れないでください。

IntegerSet::IntegerSet(){


           int temp[100] = {0};
           set = temp;



}

私はあなたのコンストラクターがあなたが成し遂げようとしていることに意味をなさないと思います。デストラクタには、次のものが含まれます。

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

そもそも配列を動的に割り当てた場合、削除は素晴らしいです。この不要なポインターのすべてに遅れずについていきたい場合は、コンストラクターは次のようになります。

IntegerSet::IntegerSet(){

           set = new int[100];
         for(int i; i < 100; i++)
              set[i] = 0;


}

この場合、ポインタや動的に割り当てられたメモリはまったく使用しません。アレイを拡大または縮小する必要はありません。また、main関数が存在した後に存在する必要はありません。すべてのポインタを使わずに単純化してみてください。

于 2012-04-20T00:57:05.593 に答える