【问题标题】:std::string in object being deleted during push_back to std::vector对象中的 std::string 在 push_back 到 std::vector 期间被删除
【发布时间】:2015-01-25 22:33:48
【问题描述】:

我有一个包含 std::string 的类。该类本身完全没问题,但问题是我有另一个类,其中包含第一个类的 std::vector。关键是,在第二个类的构造函数中,我从文件中加载了一些名称,我尝试将第一个类的对象 push_back 到第二个类的向量中。第一类的对象构造完美(我尝试读取其中的 std::string )但是当它们被推到向量时,字符串就消失了!我尝试使用 emplace_back 但这也无济于事。代码如下:

#include <vector>
#include <iostream>
#include <fstream>

class CItemTemplate {
protected:
    char id;
    std::string name;
public:
    CItemTemplate ():id(0),name(""){};
    CItemTemplate (char _id, std::string _name) : id(_id){name = _name;};
    CItemTemplate (const CItemTemplate& pattern) {id = pattern.GetID();}
    ~CItemTemplate (){};

    char GetID() const {return id;};
    std::string GetName() {return name;}
    //sf::Texture* GetTexture() const {return tekstura;}
};

class CItemSystem {
    std::vector<CItemTemplate> item_list;
public:
    CItemSystem(std::string fpthItems);
    ~CItemSystem(){}


    void list() {
        for (unsigned int i = 0; i < item_list.size(); ++i) {
            std::cout << (int)item_list[i].GetID() << " " << item_list[i].GetName() << std::endl << std::endl;
        }
    }
};
CItemSystem::CItemSystem(std::string fpthItems){
    std::ifstream file;
    file.open(fpthItems);
    if (!file.is_open()) std::cout << "error!\n";
    char name[64];
    CItemTemplate tempitem;
    item_list.push_back(CItemTemplate());
    std::cout << "loading items...\n\n";
    for (int i = 1;!file.eof();++i) {
        file.getline(name,64,'|');
        std::cout << CItemTemplate(i,(std::string)name).GetName() << std::endl << std::endl;
        item_list.push_back(CItemTemplate(i,(std::string)name));

    }
    file.close();
}

int main()
{
    CItemSystem ItemSystem("items.txt");

    std::cout << "writing list of items...\n\n";

    ItemSystem.list();

    return 0;
}
};
CItemSystem::CItemSystem(std::string fpthItems){
    std::ifstream file;
    file.open(fpthItems);
    if (!file.is_open()) std::cout << "error!\n";
    char name[64];
    CItemTemplate tempitem;
    item_list.push_back(CItemTemplate());
    std::cout << "loading items...\n\n";
    for (int i = 1;!file.eof();++i) {
        file.getline(name,64,'|');
        std::cout << CItemTemplate(i,(std::string)name).GetName() << std::endl << std::endl;
        item_list.push_back(CItemTemplate(i,(std::string)name));

    }
    file.close();
}
CItem CItemSystem::Item(char id) {
    return (CItem(item_list[id]));
}

int main()
{
    CItemSystem ItemSystem("items.txt");

    CItem przedmiota = ItemSystem.Item(2);
    CItem przedmiotb = ItemSystem.Item(4);

    std::cout << "writing list of items...\n\n";

    ItemSystem.list();

    return 0;
}

结果:

正在加载项目...

插头

塞住的瓶子

不插电的瓶装水

插水

一瓶水

正在编写项目列表...

0

1

2

3

4

5

6

7

8

przedmioty.txt 文件:

瓶|插头|插瓶|水|插瓶水|插头带水|瓶装水|

【问题讨论】:

  • 类本身并不完全没问题。

标签: c++ vector stl stdstring


【解决方案1】:

您的复制构造函数(采用const CItemTemplate&amp; 的构造函数)未正确实现:它不会复制名称。

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 2013-10-15
    • 2021-06-18
    • 2023-03-21
    相关资源
    最近更新 更多