我有类似的东西:
#include<vector>
using namespace std;
vector<char> temp;
vector<char> allbytes = GetBytes();
vector<MyClass> outsidecontainer;
for(int i=0; i<allbytes.size(); i++){
//Populate my buffer
if(something){
temp.push_back(allbytes[i]);
}
//temporary buffer now needs to be used to create MyClass object
//and outside container store this MyClass object
else{
MyClass m(temp);
outsidecontainer.push_back(m);
//Empty the temporary buffer ready for next population
temp.clear();
}
}
class MyClass{
public:
MyClass(vector<char> Message);
private:
vector<char> Message;
};
问题是,到最后,outsidecontainer持有空的MyClass对象。换句话说,由于clear(),temp已被清空。但是,我并不认为这会影响外部容器中的值,因为temp被复制到MyClass m中,MyClass m也被复制到outsidecontainer中。它们不存储对象的引用或指针??
如何实现上述设计,能够使用temp创建MyClass对象并为下一个群体清除它?
编辑:
尽管MyClass m具有循环范围,但是在循环结束后添加到outsidercontainer的对象是否仍然存在,因为该值已复制到数组中?
EDIT2:
#include "FIXMessage.h"
FIXMessage::FIXMessage(vector<char> message){
Message = message;
}
FIXMessage::FIXMessage(const FIXMessage& rhs){
}
答案 0 :(得分:2)
您的第二个编辑显示了此
FIXMessage::FIXMessage(const FIXMessage& rhs){
}
通过执行此操作,您明确强制FIXMessage
复制构造函数复制 nothing 。这就是您使用此复制构造函数复制的所有对象最终为空的原因。是的,在向向量添加元素时使用了复制构造函数。
如果您想编写自己的复制构造函数,则您有责任仔细复制该类的所有子对象:基础子对象和成员子对象。你必须手动完成。相反,你完全压制了所有复制。为什么呢?
难怪复制的对象最终为空。
但真正的问题是你是否真的需要手动实现的复制构造函数。也许编译器提供一个会工作正常?没有看到你的FIXMessage
类包含的内容,就没有办法说。
例如,如果您的FIXMessage
包含std::vector
而没有其他内容,则您根本不必编写复制构造函数。编译器将为您提供一个,它将正确复制所有内容。
最后,学习使用引用和初始化列表
FIXMessage::FIXMessage(const vector<char> &message) : Message(message)
{}
按值传递像std::vector
这样的重物并没有多大意义,除非你有充分的理由这样做。
P.S。所以你发布的原始代码是假的。不要发布假代码。它只会浪费人们的时间。
答案 1 :(得分:0)
我可能错了,因为我们不知道你的MyClass构造函数中发生了什么,但你的构造函数参数和向量成员共享相同的名字......这可能是问题所在。
我刚用这个MyClass尝试了你的代码:
class MyClass{
public:
MyClass(vector<char> Message)
{
m_Message = Message;
}
private:
vector<char> m_Message;
};
并且外部容器向量仍然包含在循环结束时输入的所有值,即在许多temp.clear()之后;
希望这有帮助