【问题标题】:Object-oriented programming err面向对象编程错误
【发布时间】:2019-10-29 13:01:43
【问题描述】:

我在下面的代码中遇到了一些错误,导致无法运行,似乎错误在析构函数中但我不知道如何修复它,请帮我检查,谢谢

#include<iostream>
#include<string.h>
using namespace std;


class SinhVien{
    private:
        static int msv;
        char name[256];
        char address[256];
        int phone;
        float point1, point2, point3;
    public:

        SinhVien(){
        }
        ~SinhVien();
        void input(){
            cout <<"Nhap ten: ";
            fflush(stdin);
            gets(name);
            cout <<"Nhap dia chi: ";
            fflush(stdin);
            gets(address);
            cout <<"Nhap so dien thoai: ";
            cin >>phone;
            cout <<"Nhap diem 3 mon: ";
            cin >>point1 >> point2 >> point3;
        }
        void output(){
            cout <<"Ma sinh vien: "<<msv<<endl;
            msv++;
            cout <<"Ho ten: "<<name<<endl;
            cout <<"Dia chi: "<<address<<endl;
            cout <<"So dien thoai: "<<phone<<endl;
            cout <<"Diem 3 mon: "<<point1<<" "<<point2<<" "<<point3<<endl;
        }

};

main(){
    SinhVien sv;
    sv.input();
    sv.output();
    system("pause");
} 

这是一个错误

C:\Users\Admin\AppData\Local\Temp\ccaMkngb.o    ex4.cpp:(.text+0x4e): undefined reference to `SinhVien::~SinhVien()'
C:\Users\Admin\AppData\Local\Temp\ccaMkngb.o    ex4.cpp:(.text+0x64): undefined reference to `SinhVien::~SinhVien()'
C:\Users\Admin\AppData\Local\Temp\ccaMkngb.o    ex4.cpp:(.rdata$.refptr._ZN8SinhVien3msvE[.refptr._ZN8SinhVien3msvE]+0x0): undefined reference to `SinhVien::msv'
C:\Users\Admin\Desktop\OOP\exclass\collect2.exe [Error] ld returned 1 exit status

【问题讨论】:

  • 请将错误消息作为文本复制并粘贴到问题中。
  • “似乎错误在析构函数中” 你没有实现任何析构函数。如果您不想要任何析构函数,则只需删除声明即可。
  • 除非你的类是一个基类并且你想提供一个空的virtual析构函数,你不应该编写一个空的析构函数。如果您知道没有什么可破坏的,那么您会告诉编译器的优化器有一个用户定义的析构函数什么都不做,从而使事情变得更糟。 See this
  • edit 将您的代码缩减为您的问题的minimal reproducible example。您当前的代码包含许多与您的问题无关的内容 - 一个最小样本通常看起来类似于一个好的单元测试:只执行一项任务,并为可重复性指定输入值。

标签: c++ class


【解决方案1】:

对于初学者,您必须定义在类中声明的静态数据成员

static int msv;

例如在类定义之后定义它

int SinhVien::msv;

并且声明了析构函数

~SinhVien();

但未定义。

您可以改为在类定义中编写

~SinhVien() = default;

也是这样的称呼

fflush(stdin);

具有未定义的行为。删除它。

【讨论】:

  • 谢谢,但还有一个错误我无法修复 C:\Users\Admin\AppData\Local\Temp\ccaMkngb.o ex4.cpp:(.rdata$.refptr._ZN8SinhVien3msvE[. refptr._ZN8SinhVien3msvE]+0x0): undefined reference to `SinhVien::msv', please check for me
  • @Khanam 我已经在我的回答中指出了这一点。重读一遍。
【解决方案2】:

您声明了您的析构函数 (~SinhVien();),但您从未实现它。

如果你不需要在析构函数中做任何事情,就不要声明它。

【讨论】:

  • 谢谢,但还有一个错误我无法修复 C:\Users\Admin\AppData\Local\Temp\ccaMkngb.o ex4.cpp:(.rdata$.refptr._ZN8SinhVien3msvE[. refptr._ZN8SinhVien3msvE]+0x0): undefined reference to `SinhVien::msv', please check for me
【解决方案3】:

错误信息很清楚:析构函数~SinhVien(); 已声明,但未定义。如果您没有要清理的内容,则无需声明析构函数。或者直接改成~SinhVien() {}

【讨论】:

  • 谢谢,但还有一个错误我无法修复 C:\Users\Admin\AppData\Local\Temp\ccaMkngb.o ex4.cpp:(.rdata$.refptr._ZN8SinhVien3msvE[. refptr._ZN8SinhVien3msvE]+0x0): undefined reference to `SinhVien::msv', please check for me
  • 您现在在每个答案下都发送了此评论,甚至是在您提出问题之前 真正回答了这个问题的那个。为什么不简单地用谷歌搜索错误代码?
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 2011-07-09
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多