в C ++ я хочу сериализовать мои переменные класса, но у него есть две проблемы - PullRequest
0 голосов
/ 29 марта 2020

Я хочу сериализовать свой класс, но у меня есть две проблемы.

Сначала я покажу свой класс.

namespace CommonData
{
    enum DataType { SHPERICAL, COORDINATE, VIEW };

    class Data
    {
    public:
        virtual int serialize(char** param) = 0;

    protected:
        //every size is byte unit
        int initialize(char** param, int size);

        int fill(char** param, int start, int size, void* src);

    private:
        DataType _type;
    };

    class CoordinateData : public Data
    {
    public:
        int serialize(char** param) override;

    private:
        int _x, _y, _z;
    };
};

и это cpp код

int Data::initialize(char** param, int size)
{
    *param = new char[size];
    cout << "size : " << size << endl;

    return fill(param, 0, sizeof(DataType), &_type);
}

int Data::fill(char** param, int start, int size, void* src)
{
    char* p = reinterpret_cast<char*>(src);

    int i = 0;
    while(i < size)
    {
        cout << "i : " << i << endl;
        cout << "*(p + i) : " << (int)*(p + i) << endl;
        *param[start + i] = *(p + i);
        cout << "*param[start + i] : " << (int)*param[start + i] << endl;
        i++;
        cout << "==============" << endl;
    }

    return start + size;
}

int CoordinateData::serialize(char** param)
{
    int end = 0;

    end = initialize(param, sizeof(CoordinateData));

    return end;
}

, поэтому, если я запускаю основной код, как этот

int main()
{
    char* arr = nullptr;

    CommonData::CoordinateData _coor(1, 2, 3);

    int size = _coor.serialize(&arr);
}

, вывод консоли будет таким:

size : 20
i : 0
*(p + i) : 1
*param[start + i] : 1
==============
i : 1
*(p + i) : 0
*param[start + i] : 0
==============
i : 2
*(p + i) : 0

Мой первый вопрос: почему размер класса CoordinateData равен 20? ? я предсказал, что это будет 16 (перечисление DataType _type, int _x, _y, _z -> 4 * 4 = 16 байт)

, а во-вторых, функция заполнения не работает. я удалил некоторые функции печати, но когда я проверяю доступ к * param [start + i = 2], это возможно со значением мусора, но когда я запускаю основной код, они заканчивают так.

я слышал Доступ к сырому адресу памяти в С ++ возможен для каждого кода без гарантии безопасности программы. так что это не может быть выброшено из памяти ошибки, и я подумал, что char * arr это куча памяти, так что это не будет доступ к памяти кода или области данных, но он просто отключился. почему это произошло?

1 Ответ

1 голос
/ 29 марта 2020

operator[] имеет более высокий приоритет, чем operator*.

Другими словами, вам нужно сделать

(*param)[start + i] = *(p + i);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...