这个错误信息提示 st_subject
结构体的默认构造函数被删除了。这是因为 st_subject_Type
是一个联合体,且它内部包含了一些有自定义构造函数或没有默认构造函数的结构体,比如 QList<QString>*
和 QImage
。
原因
- 未定义默认构造函数:C++ 中,如果一个类(或结构体)包含某些类型的成员(如无默认构造函数的类),那么编译器不会自动生成默认构造函数。
- 联合体和非平凡类型:在联合体中,只能存储一个成员,因此该联合体中不能有不平凡类型(如拥有自己的构造、析构、拷贝等行为的类型)的成员。
解决方法
可以通过以下几种方法来解决这个问题:
方法一:添加自定义构造函数
给 st_subject
添加一个自定义的构造函数,并初始化所有必要的成员。例如:
struct st_subject {
int subject_number;
int subject_itype; //1判断题 2选择题 3多选题
QString subject_name;
st_subject_Type subject_Type;
QImage image;
int score;
QString formattype;
QString picfilepath;
// 自定义构造函数
st_subject() : subject_number(0),
subject_itype(0),
score(0) { }
};
方法二:使用指针而不是对象
如果你的设计允许,可以考虑将一些较复杂的数据结构改为指针或者智能指针,以便避免管理复杂对象生命周期的问题:
struct st_subject_Type {
// ... (保持原样)
};
struct st_subject {
int subject_number;
int subject_itype; //1判断题 2选择题 3多选题
QString subject_name;
// 使用 std::shared_ptr 或者 std::unique_ptr 来管理内存
std::shared_ptr<st_subject_Type> subject_Type;
QImage image;
int score;
QString formattype;
QString picfilepath;
st_subject() :
subject_number(0),
subject_itype(0),
score(0),
subject_Type(std::make_shared<st_subject_Type>()) { }
};
更新代码示例
以下是你可能想要的完整更新后的代码:
#include "mainwindow.h"
#include <QApplication>
#include <QImage>
#include <QList>
#include <QString>
#include <memory>
struct st_answer_trueOrfalse {
bool banswer = false;
bool banswer_standard = false;
bool bret = false;
};
struct st_answer_choose {
QList<QString> *banswer = nullptr; // 初始化为nullptr以避免悬空指针
QList<QString> *banswer_standard = nullptr; // 同上
bool bret = false;
};
struct st_answer_choose_multiple {
QList<QString> *banswer = nullptr;
QList<QString> *banswer_standard = nullptr;
bool bret = false;
};
struct st_answer_blank {
QList<QString> *banswer = nullptr;
QList<QString> *banswer_standard = nullptr;
bool bret = false;
int socr = 0; //得分
};
struct st_answer_questions {
QString banswer;
QString banswer_standard;
bool bret = false;
int socr=0; //得分
};
typedef union {
st_answer_blank blank ;
st_answer_questions questions ;
st_answer_trueOrfalse trueOrfalse;
st_answer_choose choose ;
st_answer_choose_multiple choose_multiple ;
} st_subject_Type;
struct st_subject {
int subject_number=0; // 默认值初始化
int subject_itype=0; // 默认值初始化 (1判断题, 2选择题, ...)
QString subject_name;
st_subject_Type subject_Type {};
// 注意,这里需要确保对图片相关处理
QImage image{};
// 分数及其他属性初始化
int score=0 ;
QString formattype{};
QString picfilepath{};
};
// 主程序入口点
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
// 使用堆内存创建时,你必须在适当的时候释放它。
auto* subject = new st_subject();
w.show();
// 可以根据需要实现delete逻辑,例如在关闭窗口时.
return a.exec();
}
请记住,使用动态内存分配后,你应该在合适的位置释放这段内存,以防止内存泄漏。如果条件允许,尽量使用智能指针来自动管理资源。
内容由零声教学AI助手提供,问题来源于学员提问