setField()中类的更改未被持久化

时间:2014-03-08 01:20:41

标签: c++ class set getter-setter

我有一个类,我试图设置一个值,如果它正确插入到一个集合中。这是上课。

class flow {
    std::string source, dest, protocol, startTime; //
public:
    flow() {}
    flow(std::string & s, std::string & d, std::string p) :
            source(s), dest(d), protocol(p) {}
        bool operator==(const flow& rhs) const;
        bool operator<(const flow& rhs) const;
        bool setFields(std::string &, std::string &, std::string &);
        std::string getSource() const;
        std::string get_startTime() const;
            //other getters not shown
        void set_startTime(std::string &);
            //other setters not shown
        virtual ~flow();
        std::string createKey() const;
};

bool flow::setFields(std::string & srcArg, std::string & destArg,
    std::string & protocolArg) {
    source = srcArg;
    dest = destArg;
    protocol = protocolArg;
    return true;
}


void flow::set_startTime(std::string & a) {
    startTime = a;
}

我有一组这个班级set<flow> flows;。我将此流程插入到集合中。如果它无法插入,我知道我已经在跟踪此流程,但如果不是,我想设置它的开始时间。

flow currentFlow;
//...
protocol = string("TCP");
currentFlow.setFields(source, dest, protocol);
key = createKeyFromFlow(currentFlow);
ret = flows.insert(currentFlow); // see if we can insert this flow
if (ret.second == false) {
        inserted = false;
        // we failed to insert
        it = ret.first; // "it" now points to element already in the set
} else {
        string stringTS;
        std::stringstream strstream;
        //convert to string and store
        strstream << currentTimeStamp;
        strstream >> stringTS;
        cout << stringTS << endl;
        currentFlow.set_startTime(stringTS);
        //sanity check to assert the value was set
        cout << currentFlow.get_flow() << endl;
}

完整性检查通过,值为print。但是,稍后当我显示这些流时,不再设置该值。我怎样才能坚持这个价值?这个currentFlow与我的set中持续存在的流量不一样吗?

如果您需要更多信息,请告诉我,我不想发布太多代码,但足以诊断问题。

1 个答案:

答案 0 :(得分:2)

问题是set::insert创建了流对象的副本。因此,您在

之后对currentFlow所做的任何更改
 ret = flows.insert(currentFlow); 

对实际存储在集合中的对象没有影响。

编辑: 正如Matt McNabb在下面提到的那样,人们应该意识到只需修改存储在流集中的副本就无法解决这个问题,因为这会使其密钥无效(例如,阅读what happens when you modify an element of an std::set?以获取更多信息)