Visual C++中的类型转换错误

Type casting error in Visual C++

本文关键字:类型转换 错误 C++ Visual      更新时间:2023-10-16

下面的代码演示了文本模式下的数据文件处理。

这是我的代码:

#include "stdafx.h"
#include "fstream"
#include "conio.h"
#include "string"
#include "iostream"
using namespace std;
int count = 0;
class student
{
    char name[50], grade;
    float mks;
public:
    student()
    {
        mks = 0;
    }
    void getdata();
    void putdata();
    void moddata();
};
void student :: getdata()
{
    cout << "Enter data for record number: " << "(++count)" << ": ";
    cout << "nEnter name of the student: ";
    cin >> name;
    cout << "nEnter marks: ";
    cin >> mks;
    cout << "nEnter grade: ";
    cin >> grade;
    _getch();
}
void student :: putdata()
{
    cout << "nDisplaying data of required record: ";
    cout << "nName: " << name << "nMarks: " << mks << "nGrade: " << grade;
    _getch();
}
void student :: moddata()
{
    cout << "Enter correct details:-" << endl;
    cout << "Enter name: ";
    cin >> name;
    cout << "nEnter marks: ";
    cin >> mks;
    cout << "nEnter grade: ";
    cin >> grade;
    _getch();
}
int _tmain(int argc, _TCHAR* argv[])
{
    fstream stu ("stud.txt", ios::in | ios::out);
    student s1;
    char ans = 'y';
    int ch, offset, mrec;
    do
    {
        cout << "nMAIN MENU:" << endl;
        cout << "1. Add Record" << endl;
        cout << "2. Modify Record" << endl;
        cout << "3. Display Record" << endl;
        cout << "4. Exit" << endl;
        cout << "Enter your choice (1-4): ";
        cin >> ch;
        switch (ch)
        {
        case 1: s1.getdata();
                stu.write ( (char*) &s1, sizeof (student) );
                break;
        case 2: if (!count)
                {
                    cout << "No record added yet. Type option number first.";
                    _getch();
                    break;
                }
                cout << "Enter the record number to be modified: ";
                cin >> mrec;
                if (mrec > count)
                {
                    cout << "Error. Only " << count << " records have been added.";
                    _getch();
                    break;
                }
                offset = (mrec - 1)* sizeof (student);
                stu.seekg (offset);
                stu.read ( (char*) &s1, sizeof (student) );    //C2440
                s1.putdata();
                cout << "Do you want to modify your record (y/n): ";
                cin >> ans;
                if (ans == 'y' || ans == 'Y')
                {
                    s1.moddata();
                    stu.seekg(offset);
                    stu.write ( (char)* &s1, sizeof (student) );
                    break;
                }
                break;
        case 3: if (!count)
                {
                    cout << "No record added yet. Type option number first.";
                    _getch();
                    break;
                }
                cout << "Enter record number to be displayed: ";
                cin >> mrec;
                if (mrec > count)
                {
                    cout << "Error. Only " << count << " records have been added.";
                    _getch();
                    break;
                }
                offset = (mrec - 1)*, sizeof (student);
                stu.seekg (offset);
                stu.read ( (char)* &s1, sizeof (student) );    //C2440
                s1.putdata();
                break;
        case 4: break;
        default: cout << "Wrong choice.";
        }
    } while (ch != 4);
    _getch();
    return 0;
}

我得到错误号

 C2440: 'type cast' : cannot convert from 'student' to 'char' 1>       No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

这似乎是一个非常奇怪的问题。我对C++没有太多经验,所以我真的无法找到解决方案。

不要尝试将student转换为char *。你为什么要那样做?

有一个辅助char *,可以用作read()的参数,然后在student中设置数据。

正如hmjd所建议的那样,cast现在似乎可以工作了,但我敦促您不要这样做。只是碰巧字符数组是类的第一个成员,而且它在内存中与对象位于同一地址。但是,如果您更改成员的声明顺序,或者引入virtual函数,甚至使用不同的编译器,那么一切都将失败。

不要投

您应该使用要修改的s1对象的成员,而不是对象本身