c++ - C++ 调用构造函数来初始化对象会产生错误
问题描述
这有什么问题:
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));
}
}
我"read access violation"
第一次Add
调用运行时。
然后我尝试:
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 - call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type.
自从我 30 年前停止编程以来,我一定忘记或错过了什么,当时 Borland C++ 是 IT ......
解决方案
在行
Itm(_sOriginalFn, _ttTimeTaken);
您没有为您的对象调用构造函数。相反,编译器将其解释为对 functor 的函数调用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
您的代码中未显示的某处相关的访问吗?
推荐阅读
- node.js - 我使用 Node.js 的 Web 应用程序没有加载到我的本地主机上
- amazon-web-services - AWS CloudWatch 警报操作一次,触发 lambda 3 次
- ansible - 如何识别使用ansible安装的操作系统的硬盘分区?
- typescript - 如何使用动态确定的泛型类型调用 Typescript 泛型方法?
- javascript - Django/Python 将 content.innerHTML 更改为 src 页面
- reactjs - 当我在 Digital Ocean 服务器上使用 API 调用时,.NET Core CORS 策略块
- azure - Azure KeyVault 和 Scala 2.11 和 Spark 2.4.4
- chisel - 如何使用两个管理器将客户端连接到 IdentityNode?
- javascript - 如何在 react-id-swiper 中正确居中和对齐图像
- python - 熊猫评分系统;显示关系为“3-4”