Использование этого указателя для записи объекта в двоичный файл в c ++ - PullRequest
0 голосов
/ 26 мая 2020
void Employee::store_data(string filename) {
    fstream file;
    file.open(filename,ios::app | ios::binary);
    if (file) {
        file.write((char*)&this,sizeof(this));
        file.close();
    }
    else cout<<"\n Error in Opening the file!";

}

вот что я пробовал. Я хочу сохранить текущий объект класса сотрудника в файл в двоичном режиме. но я получаю это

error: lvalue required as unary '&' operand
     file.write((char*)&this,sizeof(this));

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

this не является реальной переменной, поэтому вы не можете получить ее адрес. Но это уже является указателем, так что вам не нужно. Он также имеет размер указателя, поэтому ваш sizeof неверен. И тогда в C ++ вы не должны использовать приведения в стиле C. Итак, исправив эти 3 вещи, ваша строка станет

file.write(reinterpret_cast<char*>(this), sizeof(*this));

Это должно быть скомпилировано.

Однако , обратите внимание, что если Employee содержит что-то сложное, например std::string member переменные, переменные-члены-указатели, виртуальные методы, конструктор / деструктор и т. д. c, вы не можете прочитать данные обратно. Эта запись в этом случае не записывает все или записывает неправильные значения времени выполнения, и вы получаете обратно мусор. Вы попадаете на ужасную территорию Неопределенное поведение , может произойти все, что угодно (включая вещи, которые, по-видимому, работают, когда вы это проверяете).

1 голос
/ 26 мая 2020

Язык не позволяет использовать &this в качестве выражения, поскольку (https://timsong-cpp.github.io/cppwp/n3337/class.this#1)

ключевое слово this является выражением prvalue

Вы можете использовать оператор addressof (&) только в выражениях lvalue.

Что еще более важно, вам нужно использовать

file.write(reinterpret_cast<char const*>(this), sizeof(*this));

для сохранения объекта.

...