首页 > 解决方案 > 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 ......

标签: c++constructor

解决方案


在行

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您的代码中未显示的某处相关的访问吗?


推荐阅读