дополнение перегрузки присваивает динамически размещенный указатель на массив объектов класса c ++ - PullRequest
1 голос
/ 15 октября 2019

первый раз. Заранее благодарим за вашу переписку и терпение.

Мне нужно предотвратить копирование объекта, если этот объект уже существует в моем массиве.

Я не могу понять, как их сравниватьзначения и предотвратить копирование.

Мой следующий шаг пытается: unique_ptr или shared_ptr или compare() или iterator.

НЕТ ВЕКТОРОВ .... Я ДОЛЖЕН ВЫДЕЛИТЬ ИДЕЛОКУЛИРОВАТЬ ВСЕ.

ConfirmationSender.h

class ConfirmationSender {
    Reservation** ppCon;
    size_t cCnt;
public:
    ConfirmationSender();
    ~ConfirmationSender();
    ConfirmationSender& operator+=(const Reservation& res);
    // ConfirmationSender& operator-=(const Reservation& res);
    void display(std::ostream& os) const;
};

std::ostream& operator<<(std::ostream& os, const ConfirmationSender& obj);

ConfirmationSender.cpp

ConfirmationSender& ConfirmationSender::operator+=(const Reservation& res) {
    if (cCnt == 0) {
        ++cCnt;
        ppCon = new Reservation* [cCnt];
        ppCon[0] = new Reservation(res);
    }
    else {
        Reservation** temp1 = nullptr;
        temp1 = new Reservation * [cCnt];

        for (size_t i = 0; i < cCnt; i++) {
            temp1[i] = ppCon[i];
        }

        ++cCnt;

        delete[] ppCon;
        ppCon = new Reservation * [cCnt];

        for (size_t i = 0; i < cCnt - 1; i++) {
            ppCon[i] = temp1[i];
        }
        ppCon[cCnt - 1] = new Reservation(res);

        delete[] temp1;
        temp1 = nullptr;

        /*
        NEED TO IMPLEMENT CONDITION
        SO THE VALUE I COPY 
        CANNOT BE A VALUE ALREADY EXISTING IN ARRAY
        */
    }

    return *this;
}
class Reservation {
    std::string id, name, email;
    int seats, day, hour;

public:
    Reservation();
    Reservation(const std::string& m_res);
    void display(std::ostream& os) const;
};

std::ostream& operator<<(std::ostream& os, const Reservation& obj);
Reservation::Reservation() {
    seats = 0;
    day = 0;
    hour = 0;
};

Reservation::Reservation(const std::string& m_res) {
    std::string t_str;
    t_str = m_res;
    t_str.erase(std::remove(t_str.begin(), t_str.end(), ','), t_str.end());

    istringstream iss(t_str);
    std::string buffer = {};
    static int count = 0;

    while (iss >> buffer) {
        switch (count % 6) {
            case 0: id = buffer; break;
            case 1: name = buffer; break;
            case 2: email = buffer; break;
            case 3: seats = atoi(buffer.c_str()); break;
            case 4: day = atoi(buffer.c_str()); break;
            case 5: hour = atoi(buffer.c_str()); break;
        }
        count++;
    }
    buffer.clear();
    iss.str(std::string());
}

void Reservation::display(std::ostream& os) const {
    string menu_type;

    if (hour >= 6 && hour <= 9) { menu_type = "Breakfast"; }
    else if (hour >= 11 && hour <= 15) { menu_type = "Lunch"; }
    else if (hour >= 17 && hour <= 21) { menu_type = "Dinner"; }
    else { menu_type = "Drinks"; }

    os << "Reservation "
        << id << " "
        << name << " <"
        << email << "> "
        << menu_type << " on day "
        << day << " @ "
        << hour << ":00 for "
        << seats << " people." << '\n';
}

std::ostream& operator<<(std::ostream& os, const Reservation& obj) {
    obj.display(os);
    return os;
}

main.cpp

// Confirmation Sender
{
    std::cout << "CS: Testing Operators\n";
    std::cout << "==========================\n";
    sender1 += *ppReservations[5];
    sender1 += *ppReservations[16];
    sender1 += *ppReservations[16];
    // THE SECOND [16] SHOULD NOT BE COPIED BY ADDITION OPERATOR
    std::cout << sender1;
    std::cout << "==========================\n\n";
}
...