代码之家  ›  专栏  ›  技术社区  ›  Bach

类中的C++设置字符串属性值正在引发“访问冲突读取位置”

c++
  •  2
  • Bach  · 技术社区  · 16 年前

    我很难让这个简单的代码工作:

    #pragma once
    #include <iostream>
    #include <string>
    using std::string;
    
    class UserController;
    #include "UserController.h"
    class CreateUserView
    {
    public:
     CreateUserView(void);
     ~CreateUserView(void);
     UserController* controller;
     void showView();
    
     string name;
     string lastname;
     string address;
     string email;
     string dateOfBirth;
    };
    

    我只需要在getline()实现中设置这些属性。

    CreateUserView::CreateUserView(void)
    {
    
    }
    void CreateUserView::showView()
    {
    
     cout << endl << "  New User" << endl;
     cout << "--------------------------" << endl;
     cout << "  Name\t\t: ";
     getline(cin, name);
    
     cout <<  "  Lastname\t: ";
     getline(cin, lastname);
    
     cout << "  Email\t\t: ";
     getline(cin, email);
    
    
     cout << "  ===============================" << endl;
     cout << "   1. SAVE   2.CHANGE   3.CANCEL" << endl;
     cout << "  ===============================" << endl;
     cout << "  choice: ";
     int choice;
     cin >> choice;
     cin.ignore();
    
     controller->createUser_choice(choice);
    }
    

    我一直在这一行得到“访问冲突读取位置”错误:

    getline(cin, name);
    

    为类的std::string属性赋值的最佳方法是什么? 即使name=“whatever”也会抛出错误!!

    谢谢

    编辑: 用户控制器正在实例化CreateUserView:

    CreateUserView *_createUserView;
    

    CreateUserView的实例化方式如下:

    void UserController::createUser()
    {
        //Init the Create User View
        if(_createUserView == NULL)
        {
            _createUserView = new CreateUserView();
            _createUserView->controller = this;
        }
        _createUserView->showView();
    }
    
    2 回复  |  直到 16 年前
        1
  •  3
  •   Péter Török    16 年前

    您似乎无法正确初始化变量:

    CreateUserView *_createUserView;
    

    因此,它是一个悬空指针,而不是 NULL (在C++中,除了少数例外,变量不会自动初始化为0)。所以这里

    if(_createUserView == NULL)
    {
        _createUserView = new CreateUserView();
        _createUserView->controller = this;
    }
    

    这个 if 块未执行,此处

    _createUserView->showView();
    

    您会收到访问冲突。将指针正确初始化为空:

    CreateUserView *_createUserView = NULL;
    
        2
  •  1
  •   David Gladfelter    16 年前

    尝试更改您的全球声明:

    CreateUserView *_createUserView = NULL;