类A包含类B指针,类B包含类A变量

源码(插装过后)

#include"json/json.h"
#pragma once

#include <iostream>
#include <string>

class MyPointer;

class MyObject
{
public:
        void show() const
        {
                std::cout << "this is MyObject" << std::endl;
                std::cout << "my data: " << data_ << std::endl;
                if (m_pointer_ != nullptr) std::cout << "m_object show(): " << std::endl;
        }
private:
        const std::string data_;
        MyPointer* m_pointer_;
public:
friend class DriverMyObject;
MyObject(std::string data_, MyPointer *m_pointer_, bool Wings):data_(data_), m_pointer_(m_pointer_)
{}
};

class MyPointer
{
public:
        void show() const
        {
                std::cout << "this is MyPointer" << std::endl;
                std::cout << "my data: " << data_ << std::endl;
                std::cout << "m_object show(): " << std::endl;
                m_object_.show();
        }
private:
        std::string data_;
        MyObject m_object_;
public:
friend class DriverMyPointer;
MyPointer(std::string data_, MyObject m_object_, bool Wings):data_(data_), m_object_(m_object_)
{}
MyPointer()
{}
};

初版解决方法

驱动生成

1.成员变量是类,将其类型存放在vector中(vector中初始存放驱动生成所生成的类的类型)

2.对该类进行驱动生成,处理其成员变量

3.遇见成员变量为类,与vector中对比

4.如果存在相同数据的停止,此成员变量指针赋值为空,普通的类对象不再处理

5.不同将类型放入vector中,继续执行2

出现问题

以MyObject类为例子

vector中存放顺序:

MyObject, MyPointer, 然后就遇到 MyPointer中的成员变量MyObject m_object_,与MyObject相同,所有停止赋值,不对它进行处理。

如果MyObject不存在默认构造函数,此时m_object_就无法生成,出现错误

解决方法

在3中对比判断之前,先判断成员变量是否为指针,指针则对比,非指针,就存入vector中继续处理.

以MyObject类为例子

vector中存放顺序:

1.MyObject

2.MyObject, MyPointer

3.MyObject, MyPointer, MyObject

4.MyPointer* m_pointer_ ;为指针,且有相同数据。驱动生成 MyPointer* m_pointer_ = nullptr;

驱动代码

主要是两个类的构造代码

//类MyObject
DriverMyObject::DriverMyObject(Json::Value Root, int times)
{
        Json::Value _MyObject_Root = Root["MyObject" + std::to_string(times)];
        std::string _data_ = _MyObject_Root["data_"].asString();

        int _m_pointer_pointSize = 0;
        Json::Value _m_pointer_m_pointer__Root = _MyObject_Root["m_pointer_"][_m_pointer_pointSize];
        std::string _m_pointer_data_ = _m_pointer_m_pointer__Root["data_"].asString();

        Json::Value _m_pointer_m_object_m_object__Root = _m_pointer_m_pointer__Root["m_object_"];
        std::string _m_pointer_m_object_data_ = _m_pointer_m_object_m_object__Root["data_"].asString();

        MyPointer* _m_pointer_m_object_m_pointer_ = nullptr;

        MyObject _m_pointer_m_object_(_m_pointer_m_object_data_, _m_pointer_m_object_m_pointer_, false);

        MyPointer* _m_pointer_ = new MyPointer(_m_pointer_data_, _m_pointer_m_object_, false);

        _MyObject = new MyObject(_data_, _m_pointer_, false);
}
//类MyPointer
DriverMyPointer::DriverMyPointer(Json::Value Root, int times)
{
        Json::Value _MyPointer_Root = Root["MyPointer" + std::to_string(times)];
        std::string _data_ = _MyPointer_Root["data_"].asString();

        Json::Value _m_object_m_object__Root = _MyPointer_Root["m_object_"];
        std::string _m_object_data_ = _m_object_m_object__Root["data_"].asString();

        MyPointer* _m_object_m_pointer_ = nullptr;

        MyObject _m_object_(_m_object_data_, _m_object_m_pointer_, false);

        _MyPointer = new MyPointer(_data_, _m_object_, false);
}