два указателя одинаковые ссылки

Я действительно новичок в C ++, я просто узнал об этом пару недель назад. У меня проблема с двумя указателями, индивидуально указывающими на одну и ту же ссылку. Когда я пытаюсь переназначить * workingOn, тогда * std :: cout << static_cast <int> ( user -> getPermission ()) << endl ; // return 0 Клиент c_temp ( имя пользователя , пароль , разрешение :: CUSTOMER ); s_customer . push_back ( c_temp ); workingOn = & s_customer [ s_customer . size () - 1 ]; std :: cout << static_cast <int> ( user -> getPermission ()) << endl ; // возвращает случайную память возврата customerLoggedInScreen (); превращается в мусор.

Вот код:

void Controller::login()
{
bool loggedIN = false;

using namespace std;
string input_password, input_username;

//call the login screen

    UI.login(input_username, input_password);


    /*
    If the user is not a customer we will login as a manager
    */
    for (int i = 0; i < s_customer.size(); ++i) {
        user = &s_customer[i];

        if (user->getUsername().compare(input_username) == 0 && user->getPassword().compare(input_password) == 0) {
            user_loggedIn = input_username; // store the person who is logged in

            if (user->getPermission() == Permission::CUSTOMER) {
                workingOn= &s_customer[i];
                return whatUItoDisplay();
            }
            return whatUItoDisplay();
        }
    }

get Permission - это перечисление, которое может либо вернуть 0,1,2, которые включают менеджера, клиента, обслуживание.

* Пользователь может быть менеджером или клиентом * workingOn - это человек, над которым вы работаете. Каким может быть сам (как клиент)

Код мог быть спроектирован лучше ... но мне было не очень удобно с полиморфизмом и C ++

Я пытаюсь изменить человека, которого работает пользователь. Но потом мой указатель превращается в память мусора. Изначально пользователь и человек, работающие над ним, одинаковы.

Вот инициализация пользователя:

Interface UI;
std::string user_loggedIn;
Customer *user = nullptr;
Customer *workingOn = nullptr;

}

в моем заголовке у меня: public: std :: vector s_customer; // Это будет удерживать всех клиентов в программе

user

c++,pointers,

-3

Ответов: 1


2

Я подозреваю, что вы получаете значения мусора, поскольку userон больше не действителен, если вектор s_containerизменен. Когда вы звоните s_container.push_back( ... )и не хватает емкости, внутренний вектор вызовет, realloc( )который имеет шанс (очень вероятно) изменить местоположение памяти на следующий доступный непрерывный блок памяти, чтобы он соответствовал новой емкости.

Просмотрите эту таблицу, когда итераторы (или любые ссылки на память в этом отношении) недействительны в векторах.

Таблица недействительности

Есть несколько вещей, которые вы можете сделать, чтобы решить эту проблему. Первый вариант - хранить индекс для пользователя, а не самого указателя. Это гарантирует, что память действительна, поскольку это просто смещение от правильной ячейки памяти.

user->

становится

s_container[ userIndex ].

Другим вариантом является использование контейнера, который гарантирует достоверность указателя / итератора после добавления элементов. Самый распространенный в STL std::deque. Вот таблица недействительности для deques.

C ++, указатели,
Похожие вопросы