将对象值传递给缓冲区

时间:2014-06-25 08:46:51

标签: c++ pointers object buffer

我有一个班级样本:

class sample{
public:
    sample(){
        sample_name=new char[10];
    }
    int sample_num;
    float sample_wt;
    char *sample_name;
};

创建了它的对象,并将值作为以下内容加入:

sample *object= new sample();
object->sample_num=10;
object->sample_wt=20.02;
object->sample_name="test";

我的问题如下:

我将如何创建一个包含对象中存储的所有信息的缓冲区? 我尝试这样做如下:

char * buffer = new char[256];
buffer =  reinterpret_cast <char *> ( object );

现在,我看到的是对象确实包含了sample_num,sample_wt和sample_name的所有三个值,但是这些值没有传递给缓冲区,缓冲区显示了垃圾值。

那么,我将如何在缓冲区中获取这些值?

3 个答案:

答案 0 :(得分:0)

如果您正在使用缓冲区,则可以使用stl :: vector缓冲某些对象并将这些对象放到向量中,而不是使用<char *>使用<void *>,如下面的代码所示。

'int main()
{
int x;
int size;


vector<BoxOfProduce>box;
cout<<"How many boxes you want";
cin>>size;
for ( x = 0; x < size; x++)
{
   BoxOfProduce obj; //create an object
   box.push_back(obj); //insert it into the vector
}

for ( x = 0; x < size; x++)
{
    box[x].setItemAry();
    box[x].randomPick();


    box[x].display();
    box[x].change();
    box[x].display2();
}

getchar();getchar();
return 0;

}&#39;

你可以使用Ques,Ques是缓冲的最佳选择。

首先创建一个结构并将所有值存储在结构中,并将该结构放入队列中。

答案 1 :(得分:0)

这个代码在很多层面都是错误的。

您的构造函数未初始化您的变量,但在免费存储上创建一个数组,并且永远不会删除它。对于默认构造函数,只需将您的成员初始化为默认值(此处可能为0,nullptr可能为sample_name)。

替换

sample *object= new sample();
object->sample_num=10;
object->sample_wt=20.02;
object->sample_name="test";

使用适当的构造函数,创建一个具有作为参数给出的值的对象。另外,要创建对象,默认情况下不必使用new,只需编写

即可
sample object

回答你的问题。如果您使用reinterpret_cast将对象视为char[],那么您依赖于对象的布局可能与您在其定义中看到的一样,也可能不同。这甚至可以工作,但您需要确保您的班级满足要求。以下是关于该主题的进一步阅读:

在此之前,如果要序列化对象,即读取和写入流/缓冲区,则应编写序列化/反序列化函数,读取和写入每个成员到流中。

答案 2 :(得分:0)

记住@Kerrek SB内存泄漏并使用标准字符串和输入/输出运算符:

#include <ostream>
#include <iostream>
#include <sstream>

class sample
{
  public:
    sample() {}
    int sample_num;
    float sample_wt;
    std::string sample_name;

    friend std::ostream & operator<<(std::ostream &, const sample&);
};

std::ostream & operator<<(std::ostream & os, const sample & sam)
{
  os << sam.sample_num << " " << sam.sample_wt << " " << sam.sample_name.c_str();
  return os;
}

int main(int argc, const char * argv[])
{
  sample *object= new sample;
  object->sample_num=10;
  object->sample_wt=20.02f;
  object->sample_name="test";

  std::stringstream buffer;

  buffer << *object;

  std::cout << buffer.str();

  delete object;

  return 0;
}