Как добавить элементы массива в набор - PullRequest
0 голосов
/ 24 января 2012

Я определил классы 'Outcome' и 'Bin'. Я пытаюсь передать массив типа Outcome в конструктор Bin, чтобы добавить каждый элемент этого массива в набор Outcome, который является свойством члена класса Bin.

//Bin.h
class Bin {
private:
    std::set<Outcome> outcomeset;
public:
    Bin();
    Bin(Outcome Outcs[], int numberofelements);
    Bin(std::set<Outcome> Outcs);
    void add(Outcome Outc);
    std::string read();

};

//In Bin.cpp

Bin::Bin(Outcome outcs[], int numberofelements) {
    int i;
    for (i=0;i<(numberofelements-1);i++) {
        outcomeset.insert(outcs[i]); //When this LIne is commented out, no compile errors!
    }
}

Это приводит к целой путанице ошибок в VS2010, которые ссылаются на файлы библиотеки. Я не смог ничего найти в Интернете или в своем учебнике "Большой C ++". Это абсолютно неправильная реализация такого рода функциональности? Или я что-то упускаю довольно простой?

Для любопытных я реализую это как часть проблемы «Рулетка» из этого бесплатного учебника http://www.itmaybeahack.com/homepage/books/oodesign.html

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: я добавил (довольно длинный) текст ошибки в pastebin, здесь: http://pastebin.com/cqe0KF3K

EDIT2: я реализовал операторы ==! = И <для класса результата, и та же строка все еще не компилируется. Вот реализации </p>

//Outcome.cpp
bool Outcome::operator==(Outcome compoutc) {
    if (mEqual(compoutc) == true) {
    return true;
}
else {
    return false;
}
}

bool Outcome::operator!=(Outcome compoutc) {
if (mEqual(compoutc) == false) {
    return true;
}
else {
    return false;
}
}

bool Outcome::operator<(Outcome compoutc) {
if (odds < compoutc.odds) {
    return true;
}
else {
    return false;
}
}

РЕДАКТИРОВАТЬ3: Реализован оператор сравнения с тегами параметров и констант, на которые нет ссылок, и теперь он компилируется!

1 Ответ

0 голосов
/ 24 января 2012

Вам необходимо определить operator< для класса, вставляемого в набор.

Также обратите внимание, что вместо явного цикла вам, вероятно, лучше использовать пару "итераторов" (указателей)в данном случае) и фактически инициализирует набор:

#include <set>
#include <string>

class Outcome { 
    int val;
public:
    bool operator<(Outcome const &other) const { 
        return val < other.val;
    }
    Outcome(int v = 0) : val(v) {}
};

class Bin {
private:
    std::set<Outcome> outcomeset;
public:
    Bin();

    // Actually initialize the set:
    Bin(Outcome Outcs[], int n) : outcomeset(Outcs, Outcs+n) {}
    Bin(std::set<Outcome> Outcs);
    void add(Outcome Outc);
    std::string read();

};

int main() { 
    // Create an array of Outcomes
    Outcome outcomes[] = {Outcome(0), Outcome(1) };

    // use them to initialize the bin:
    Bin b((outcomes),2);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...