3

问题:

错误:“&”运算符只能应用于变量或其他左值。

我试过的:

  • dynamic_cast<char*>(e)
  • reinterpret_cast<char*>(e)
  • static_cast<char*>(e)
  • (char*) e

我正在尝试做的事情:

  • 将数组 e.data(私有)写入二进制文件。

笔记:

  • e.getSize() 返回数组中的元素个数
  • e[] 返回 Employee 对象。

代码:

fstream fout;
fout.open(filename.c_str(), ios::out|ios::binary);
if(fout.good())
{
    for(int i=0;i<e.getSize();i++)
    {
        fout.write((char*)&e[i], sizeof(e[i]));
    }
}
fout.close();

员工.h

class Employee {
    friend std::ostream& operator<<(std::ostream&, const Employee &);
    private:
        int id;
        char name[50];
        char address[100];
        char phone[20];
        char department[100];
        int salary;
    public:
        Employee();
        ~Employee();
        Employee(int,char[],char[],char[],char[],int);
        bool operator==(Employee&);
};

我不知道该怎么做,我记得fout.write((char*)&e[i], sizeof(e[i]));是如何写入二进制文件。

编辑: e 声明如下: MYLIB::Bucket<Employee> e;

template <class T>
class Bucket {
    private:
        T* bkt;
        int size;
        int capacity;
        static const int stepsize = 10;

    public:
        Bucket();
        ~Bucket();

        void push_back(const T&);
        T operator[](int);
        int getSize();
        int getCapacity();
};

编辑 2: fout.write(reinterpret_cast<char*>(e[i]), sizeof(e[i]));给我第 122 行:错误:使用 reinterpret_cast 来转换?不允许使用 char*。(第 122 行是刚刚引用的行)

编辑3:

tempemp = e[i];
fout.write((char*)(&tempemp), sizeof(e[i]));

编译但出现分段错误,我将调查原因。 编译,分段错误看起来无关。

4

2 回答 2

4
 MYLIB::Bucket<Employee> e;

这似乎是一个容器。e[i]给你一个Employee价值。您需要使用获取此对象的地址,&e[i]但您可以这样做,因为它是 r 值,因此您需要将其复制到非 r 值:

Employee copye = e[i];
fout.write((char*)&copye, sizeof(e[i]));

应该管用。

顺便说一句,这一切看起来都是糟糕的代码,我不羡慕需要维护或阅读它的人。几点:

  • 您不应该使用内存中对象的二进制格式作为序列化格式。使用适当的序列化格式,如 protobuf 或 xml 或 json
  • 可以用的时候为什么要拉自己的奇怪容器std::vector std::list?重新发明轮子总是不好的
  • 从容器中按值返回元素会创建降低性能的副本。
于 2013-11-01T08:54:53.580 回答
2

我觉得

T operator[](int);

正在返回一个临时对象,该对象必须先绑定到某个地址才能获取地址

const Employee& emp = e[i];
fout.write((char*)&emp, sizeof(emp));

可能会起作用,假设这个答案是正确的,即获取引用可以延长临时对象的寿命

另一种方法可能是返回对对象的引用,这将删除临时对象的创建

const T& operator[](int);
于 2013-11-01T08:52:38.983 回答