0

我有类似的东西:

#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 也被复制到了外部容器中。他们不存储对象的引用或指针??

如何实现上述设计,能够使用 temp 创建 MyClass 对象并为下一个人口清除它?

编辑:

即使 MyClass m 具有循环范围,添加到 outsidercontainer 的对象是否会在循环完成后保留,因为值已复制到数组中?

编辑2:

#include "FIXMessage.h"


FIXMessage::FIXMessage(vector<char> message){
    Message = message;
}

FIXMessage::FIXMessage(const FIXMessage& rhs){

}
4

2 回答 2

2

您的第二次编辑显示了这一点

FIXMessage::FIXMessage(const FIXMessage& rhs){
}

通过这样做,您明确地强制FIXMessage复制构造函数不复制任何内容。这就是为什么您使用此复制构造函数复制的所有对象最终都为空的原因。是的,将元素添加到向量时会使用复制构造函数。

如果您想编写自己的复制构造函数,您有责任仔细复制该类的所有子对象:基础子对象和成员子对象。您必须手动完成。相反,你完全压制了所有的复制。为什么?

难怪复制的对象最终是空的。

但这里真正的问题是您是否真的需要手动实现的复制构造函数。也许提供的编译器可以正常工作?没有看到你的FIXMessage课程包含什么就没有办法说。

例如,如果您FIXMessage包含 astd::vector而没有其他内容,则您根本不必编写复制构造函数。编译器将为您提供一个,它将正确复制所有内容。

最后,学会使用引用和初始化列表

FIXMessage::FIXMessage(const vector<char> &message) : Message(message) 
  {}

通过值传递重的对象,比如std::vector,没有多大意义,除非你有很好的理由这样做。

PS所以你发布的原始代码是假的。不要发布假代码。只能浪费人们的时间。

于 2013-09-21T01:54:36.843 回答
0

我可能错了,因为我们不知道您的 MyClass 构造函数中发生了什么,但是您的构造函数参数和向量成员共享相同的名称......这可能是问题所在。

我只是用这个 MyClass 尝试了你的代码:

class MyClass{
    public:
    MyClass(vector<char> Message)
    {
        m_Message = Message;
    }

    private:
    vector<char> m_Message;
};

并且外部容器向量仍然包含在循环结束时输入的所有值,即在许多 temp.clear() 之后;

希望这可以帮助

于 2013-09-21T01:48:00.830 回答