-3

添付のコードは希望どおりに動作するようですが、別のファイルにある場合、main.cpp、Set.h、Set.cpp が塗りつぶされ、remove 関数の外でデクリメントされません。ここで何が起こっているのか本当にわかりません。または、すべてが1つのファイルにあることで違いが生じるのはなぜですか。

#include <iostream>
using namespace std;
typedef int value_type;

class Set {
private:
value_type *dataArray, size, filled;
public:

Set() {
    size = 50;
    dataArray = new value_type[size];
    filled = 0;
}

bool Set::isFull() const {
    return (filled == size) ? true : false; // if filled is equal to size then full.
}

bool Set::remove(const value_type& item) {

    for (int index = 0; index < filled; index++) {
        if (index != (filled - 1) && dataArray[index] == item) {
            dataArray[index] = dataArray[filled - 1];
            --filled;
            return true;

        } else {
            --filled;
            return true;
        }
    }

    return false;
}

void Set::insert(const value_type& newItem) {

    if (!isFull()) {
        dataArray[filled] = newItem;

        filled++; // increment filled to account for new entry.

    }
}

friend ostream& operator<<(ostream& out, const Set& obj) {
    out << "\nfilled: " << obj.filled << endl;
    out << "{";

    for (int index = 0; index < obj.filled; index++) {
        out << obj.dataArray[index];
        if (index != (obj.filled - 1))
            cout << ",";

    }
    out << "}";
    return out;
}
};
Set firstSet;

void pauseNwait() {
cout << "<--Enter to Continue-->";
cin.ignore();
cin.get();
}

int main() {

int choice = -1;
value_type input;

while (choice != 0) {
    cout << "       Set Manager" << endl
            << " (1) Add item to Set 1" << endl
            << " (2) Remove item from Set 1" << endl
            << " (0) Exit" << endl
            << "-----------------------------------------" << endl
            << "Choose: ";
    cin.clear();

    if (cin >> choice) {
        switch (choice) {
            case 0:
                // Exit.
                break;
            case 1:
                cout << "Enter int to add to list: ";
                cin >> input;
                firstSet.insert(input);
                cout << "First Set: " << firstSet << endl;
                pauseNwait();
                break;
            case 2:
                cout << firstSet << endl;
                cout << "Enter item to remove from list: ";
                cin >> input;
                firstSet.remove(input);
                cout << "First Set: " << firstSet << endl;
                pauseNwait();
                break;
            default:
                break;
        }
    } else {
        cin.clear(); // clear cin to avoid invalid menu input errors.
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
}
return 0;
}
4

2 に答える 2

1

dataArrayがクラスのメンバーである場合、表示されているのは、配列の境界外に値を割り当てることの副作用である可能性があります。

値は隣接するクラスメンバーに設定されます。メモリはプログラムに属しているため(クラス内にあるため)、例外は発生しません。

シナリオ:

ループは配列を通過し、何も見つかりません。
現在、インデックスは範囲外です。その位置にあるアイテムがアイテム
と等しいかどうかを確認します。アイテムと同じかもしれません。次に、その場所に配列の「最後の」アイテムをコピーします。

于 2013-02-01T19:45:01.970 に答える
1

私は問題を理解しました 1 つのファイルで小さいバージョンを作成するように圧力をかけてくれた人々に感謝します。元のプログラムでは、操作するオブジェクトが複数あったため、関数パラメーターで提供されたさまざまなオブジェクトで機能する関数を main.cpp に作成しました。これを行うには、オブジェクトのコピーを参照ではなくヘルパー関数に渡しました。挿入機能が正常に動作していたのは、参照として渡していたためです。この経験から何か学んだことがあれば、完全にコンパイル可能なコードを最小限に抑えて提供する必要があるということです。これにより、将来、助けを求める必要がなくなる可能性があります。

于 2013-02-02T04:16:23.830 に答える