【问题标题】:How do I access an object out of its block scope?如何访问块范围之外的对象?
【发布时间】:2018-10-26 13:51:45
【问题描述】:

嘿,我想弄清楚如何访问块范围之外的对象。我在将数据写入文件的 For 循环中定义了 Person personData。在循环之后,我想再次访问该对象以更新文件上的值,但它给了我错误 - personData 是未定义的标识符。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>
#include "Person.h"

using namespace std;

int main() {

    string lastName;
    string firstName;
    int age;

    //file output and creation
    ofstream outPerson("nameage.dat", ios::out | ios::binary);

    Person randPerson;

    randPerson.setLastName("unassigned");
    randPerson.setFirstName("");
    randPerson.setAge(0);
    randPerson.setId(0);

    //for loop to initialize the file with 100 records that store values lastName and firstName
    for (int i = 0; i < 100; i++) {
        outPerson.write(reinterpret_cast<const char*>(&randPerson), sizeof(Person));  //use write to output to file 
    }

    cout << "File Created" << endl;

    //file input and termination 
    ifstream inPerson("nameage.dat", ios::in | ios::out | ios::binary);

    //loops through 10 times to input 10 values (RECORD VALUES) 
    for (int j = 0; j < 2; j++) {
        int id = 0;
        do {
            cout << "Enter a valid id number: (1-100)" << endl;
            cin >> id;
        } while ((id<1)||(id>100)); //breaks do-while after it receives a valid input 


        Person personData;

        inPerson.seekg((id - 1) * sizeof(Person));
        inPerson.read(reinterpret_cast<char*>(&personData), sizeof(Person));

        //checks to see if there is already data in that area, if not then proceed to record data onto file 
        if (personData.getId() == 0) {
            cout << "Enter lastname: ";
            cin >> lastName;
            cout << "Enter firstname: ";
            cin >> firstName;
            cout << "Enter age: ";
            cin >> age;

            //sets data for the particular object 
            personData.setLastName(lastName);
            personData.setFirstName(firstName);
            personData.setAge(age);
            personData.setId(id);

            //seek position in file of user-specified record 
            outPerson.seekp((personData.getId() - 1) * sizeof(Person));

            //write user-specified information in file 
            outPerson.write(reinterpret_cast<const char*>(&personData), sizeof(Person));

            cout << "Record inserted" << endl;
        }
        else {
            cout << "There is already data there. Try another ID number" << endl;
        }//end if
    }//end for loop


    int idSearch;

    do {
        cout << "Enter a ID number: " << endl;
        cin >> idSearch;
    } while ((idSearch < 1) || (idSearch > 100));

    if (personData.getId() != 0) {
        cout << "Enter new Last name";
        cin >> lastName;
        cout << "Enter new first name";
        cin >> firstName;
        cout << "Enter age";
        cin >> age;

        //sets data for the particular object 
        personData.setLastName(lastName);
        personData.setFirstName(firstName);
        personData.setAge(age);
        personData.setId(idSearch);

        //seek position in file of user-specified record 
        outPerson.seekp((personData.getId() - 1) * sizeof(Person));

        //write user-specified information in file 
        outPerson.write(reinterpret_cast<const char*>(&personData), sizeof(Person));

        cout << "Record updated" << endl;
    }

    inPerson.read(reinterpret_cast<char*>(&personData), sizeof(Person));





    system("pause");
    return 0;
}

我假设问题是因为超出范围时无法访问该对象。那么我将如何从 for 循环下方的语句中访问对象。谢谢。

【问题讨论】:

  • 你不能,这是范围的本质。如果要在外部作用域中使用它需要在外部作用域中声明。
  • 对象不仅在范围外无法访问,而且不再存在,因此您无法在范围外访问它。解决方案是使用动态分配的对象或将其放在适当的范围内。
  • 简短的回答是让shared_ptr在那里。
  • @АлексейНеудачин 仅将其设为shared_ptr 不会解决任何问题。共享指针也不能在其范围之外访问
  • @user463035818 真的吗?

标签: c++ object


【解决方案1】:

这是C++数据模型的核心思想之一:数据一离开作用域就被删除。

为此,您需要更改personData 的范围(例如,将变量定义移出循环)。

但是要小心使用类似的东西。在最好的情况下,personData 将存储循环最后一次迭代留下的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多