Вектор объектов - C ++. Ни один оператор "<<" не соответствует этим операндам, Ошибка - PullRequest
0 голосов
/ 02 апреля 2020

Я новичок в программировании. У меня проблема. Я пытаюсь закодировать машину Enigma. У меня есть два класса. Один для Enigma, один для роторов. Роторы - это маленькие части машины-загадки, которая не имеет значения для проблемы. Моя проблема в ошибке. Я не могу cout, функция cout << rotors[0].GetRotor();, которая должна возвращать мой вектор целых чисел. Я понятия не имею, почему это так. Мне это не нужно в моей программе, но я не уверен, что мое добавление ротора в функцию enigma void AddRotor(Rotor rotor) { rotors.push_back(rotor); }, вызываемую в функции "TakeRotors", работает правильно. На мой взгляд, это должно работать хорошо, но я не могу это проверить. Отладчик, к сожалению, не показывает значения перестановки vector<Rotor> rotors;, поэтому я не уверен :( Любая помощь будет отличной. Спасибо. Вот мой полный необходимый код:)

#include <iostream>
#include <vector>

using namespace std;

class Rotor {
public:
    vector <int> permutation;
    int position;
    Rotor(vector<int> permutation) {
        position = 0;
        permutation;
    }
    vector<int> GetRotor() const {
        return permutation;
    }
};

class Enigma {
public:
    vector<Rotor> rotors;

    void AddRotor(Rotor rotor) {
        rotors.push_back(rotor);
    }
    void PrintRotor(const vector<Rotor>& rotors) {
     cout << rotors[0].GetRotor();                       // Error right here
     cout << rotors[0].position;
    }
    void setupRotor(int index) {
        Rotor rotor = rotors[index];
    }
    void MoveRotor(int index) {
        rotors[index].position++;
        cout << "Before" << endl;
    //    cout << rotors[index].permutation.data << ' ';
        Enigma::PrintRotor(rotors);
        rotate(rotors[index].permutation.begin(), rotors[index].permutation.begin() + rotors[index].permutation.size(), rotors[index].permutation.end());
        cout << "After" << endl;
        Enigma::PrintRotor(rotors);
    }
};

vector<int> take_numbers(int number) {
    vector<int> numbers;
    for (int i = 0; i < number; i++) {
        int number;
        cin >> number;
        numbers.push_back(number);
    }
    return numbers;
}

void take_rotors(int number_letters, Enigma* enigma) {
    int numberOfRotors;
 //   int numberOfNotch, positionOfNotch;
    cout << "Give number of Rotors" << endl;
    cin >> numberOfRotors;
    for (int i=0; i < numberOfRotors; i++) {
        vector<int> permutation = take_numbers(number_letters);
        Rotor Rotor(permutation);
        enigma->AddRotor(Rotor);                       // I am not sure if it adds Rotors fine.
    }
}

int main()
{
    Enigma enigma;
    int number_letters, move_rotor;
    cout << "Give number of letters in alphabet" << endl;
    cin >> number_letters;
    take_rotors(number_letters, &enigma);
//    take_reflectors(number_letters, &enigma);
    cout << "Which rotor do you want to move (index)" << endl;
    cin >> move_rotor;
    enigma.MoveRotor(move_rotor);

    return 0;
}


1 Ответ

2 голосов
/ 02 апреля 2020

Нет operator<<(std::ostream&,const std::vector<int>&), если вы хотите его, вам нужно предоставить свой собственный. Однако перегрузка операторов для типов, которые вам не принадлежат, не рекомендуется, поэтому я бы лучше написал функцию:

void print_vector(std::ostream& out, const std::vector<int>& vect) {
    for (int i : vect) {
        out << i << '\n';
    }
}

, которую вы можете вызывать следующим образом

print_vector(std::cout, rotors[0].GetRotor());

В качестве альтернативы вы можете предоставить перегрузку для <<, которая печатает все Rotor:

std::ostream& operator<<(std::ostream&,const Rotor& rotor) {
    out << rotor.position;
    for (auto& i : rotor.GetRotor()) {
        out << i;
    }
    // modify and add more to your likings
    return out;
}

Как только вы это сделаете, вы также можете предоставить перегрузку для печати вектора роторов, который вы можете использовать в Enigma::PrintRotor (который в настоящее время печатается только первый элемент вектора):

std::ostream& operator<<(std::ostream& out,const std::vector<Rotor>& rotors) {
    for (const auto& r : rotors) {
        out << r << '\n';
    }
    return out;
}

PS Ваше наименование немного сбивает с толку. Rotor имеет GetRotor, который возвращает permutations!?! Я настоятельно рекомендую использовать лучшие имена. Если у меня есть Rotor r;, тогда r - это Rotor, и неясно, что будет делать GetRotor. Может быть, переименовать его в GetPermutations?

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