我有一个班级样本:
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的所有三个值,但是这些值没有传递给缓冲区,缓冲区显示了垃圾值。
那么,我将如何在缓冲区中获取这些值?
答案 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;
}