2016-12-30 4 views
0

Я новичок в C++, и это код, где мой указатель становится нулевым, что я делаю неправильно?Указатель становится null C++

Основная функция.

// in main() function 
switch (UserView::RequestMainMenuOption()) { 
    case 1: 
    { 
     struct user_info *user; // the pointer in question. 
     if (UserController::Login(user) && user) { // shows null here 
      std::cout << user->username << std::endl; // this line does not execute. 

Контроллер.

bool UserController::Login(struct user_info *user) 
{ 
    //... 
    // std::cin username/password and validate in the user model. 
    if (User::ValidateCredentials(username, password, user)) {...} 
} 

Модель.

int User::ValidateCredentials(std::string username, std::string password, struct user_info *user) 
    { 
     // UserList is a vector of struct user_info that contains std::string username, password; 
     std::vector<user_info> UserList = User::GetUserList(); 
     // index is searched for here based on credentials... 
     // address of the element in the user list is assigned to user. 
     user = &UserList.at(index); 
     // address is successfully assigned (tested) 
     // but when returning back to the first function call in the main() function, user is NULL. 
+0

Вы, вероятно, хотите, чтобы передать аргумент 'Логин()' по ссылке. –

+0

Вы передаете 'user', всюду, по значению. Это означает, что установка 'user' внутри этой функции абсолютно не влияет. Вам нужно передать 'user' по ссылке вместо значения. Просмотрите материал в своей книге на C++, в котором говорится о передаче параметров функции по значению в сравнении с ссылкой. –

+1

вы только объявляете 'struct user_info * user;' и не выделяете его, так что это NULL, но вам повезло, потому что, если вы не находились в режиме отладки, он мог содержать мусор и выполнять ваш код в виде мусора –

ответ

0

Указатель не может или не может быть быть пустым, но что более важно это неиницализированные:

struct user_info *user /* = ???? initialise here */; // the pointer in question. 
if (UserController::Login(user) && user) { // shows null here 
    std::cout << user->username << std::endl; // this line does not execute. 

редактировал ниже, чтобы сделать его безопасно для работы благодаря Квентину

Это потому что ваш компилятор в режиме отладки устанавливает его на нуль. Вы хотите:

std::unique_ptr<user_info> user = std::make_unique<user_info)>(/* constructor arguments go here */); 

или если объект является общим:

std::shared_ptr<user_info> user = std::make_shared<user_info)>(/* constructor arguments go here */); 
+0

Argh, сырьевые указатели владения ... – Quentin