функция с векторами, которая является частью класса, не работает и без ошибок компилятора - PullRequest
0 голосов
/ 29 марта 2020

Итак, у меня есть функция-член (show_players_names и show_players_levels) класса, которая выводит на экран значение закрытой переменной.

Хотя компилятор не показывает никакой ошибки, я не вижу имена и уровни на экране.

У вас есть идеи?

Вот код:

#include <iostream>
#include <vector>
#include <array>
#include <string>
using namespace std;

class Party {
    private:
        string boss;
        vector<string> players;
        vector<int> players_level;

    public:
        string party_name;  

    Party (string party_name, string boss)  { cout << party_name << " " << boss << endl; };  
    ~Party() { cout << "Party delete" << endl; };   


    vector<string> getNames() { return players; };
    vector<int> getLevels() { return players_level; };

    vector<string> setNames (const vector<string> &new_players) { players=new_players; }
    vector<int> setLevels (const vector<int> &new_players_level) { players_level=new_players_level; 
};


 void show_players_names()
    {
        for(size_t i=0; i<players.size(); i++ )
            cout << players[i] << ' ';
        cout << endl;
    };

    void show_players_levels()
    {
        for(size_t i=0; i<players_level.size(); ++i )
            cout << players_level[i] <<' ';
        cout << endl;
    };

};

int main ()
{
    Party party1("Witchers","Vesemir");

    party1.setNames({"Gerald","Eskel","Lambert"});
    party1.setLevels( {50,45,49} );
    party1.show_players_names();
    party1.show_players_levels();

    return 0;
}

1 Ответ

0 голосов
/ 29 марта 2020

Код

vector<string> setNames (const vector<string> &new_players) { 
    players=new_players;
}
vector<int> setLevels (const vector<int> &new_players_level) { 
    players_level=new_players_level; 
}

неверен, так как нет оператора возврата. Изменение объявления методов на void делает код работающим так, как ожидается.

void setNames (const vector<string> &new_players) { 
    players=new_players;
}
void setLevels (const vector<int> &new_players_level) { 
    players_level=new_players_level; 
}

По причинам, которые мне не совсем понятны, исключение оператора возврата в функции non-void на многих компиляторах не является фатальным ошибка компиляции (что, я думаю, должно быть) и вместо этого является просто предупреждением, но сгенерированный код имеет неопределенное поведение (с g ++, например, ваши ошибки кода).

Когда вы выполняете код, содержащий UB, все может произойти, включая, очевидно, работу, но со странным поведением.

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