gpt4 book ai didi

C++ 调用构造函数来初始化对象会产生错误

转载 作者:行者123 更新时间:2023-11-27 23:44:33 27 4
gpt4 key购买 nike

这有什么问题:

struct FileListItem {
string sOriginalFn;
time_t ttTimeTaken;

FileListItem(){}
FileListItem(string _sOriginalFn, time_t _ttTimeTaken) :
sOriginalFn (_sOriginalFn), ttTimeTaken (_ttTimeTaken) { }
};

struct FileList : vector<FileListItem> {
int iCurItm;
FileList() : vector(), iCurItm(-1) {};

void Add(string _sOriginalFn, time_t _ttTimeTaken) {
push_back(FileListItem(_sOriginalFn, _ttTimeTaken));
}
}

第一次调用 Add 时,我得到一个运行时 “read access violation”

然后我尝试:

struct FileList : vector<FileListItem> {
int iCurItm;
FileList() : vector(), iCurItm(-1) {};

FileListItem Itm; // <--- new member
void Add(string _sOriginalFn, time_t _ttTimeTaken) {
Itm(_sOriginalFn, _ttTimeTaken); // <--- E0980 pointing to "Itm"
push_back(Itm);
}
}

并得到一个编译时错误:

E0980 - 在没有适当的 operator() 或转换函数到函数指针类型的情况下调用类类型的对象。

自从 30 年前我停止编程以来,我一定是忘记或错过了什么,当时 Borland C++ 是 IT...

最佳答案

行内

Itm(_sOriginalFn, _ttTimeTaken);

您没有为您的对象调用构造函数。相反,编译器将其解释为对仿函数 Itm 的函数调用。因此,它会尝试为给定的参数找到一个有效的 operator(),但没有成功。

不要在其他地方使用构造函数成员初始化列表语法... 构造函数成员初始化列表。相反,您在这里要做的是为您的成员分配一个新对象。

那么,您永远不想从 std 容器继承。他们的析构函数不是虚拟的,所以你将自己暴露在痛苦的境界中......

改用组合或类型别名:

struct FileList {
std::vector<FileListItem> flist;
int curItem;

FileList() : flist(), curItem(-1) {}

void Add(string const& _sOriginalFn, time_t _ttTimeTaken) {
// No need to construct the object before, let vector handle it
flist.emplace_back(_sOriginalFn, _ttTimeTaken);
};

至于读取访问冲突,从我看到的代码来看,没有任何解释。可能是您代码中某处未显示的与 curItem 相关的某些访问权限?

关于C++ 调用构造函数来初始化对象会产生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51702424/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com