标题:全局结构体变量包含类的问题及如何转换为全局类使用
只看楼主
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
结帖率:93.75%
已结贴  问题点数:40 回复次数:2 
全局结构体变量包含类的问题及如何转换为全局类使用
typedef struct
{
    int a;
    String str_a;
}Config_AA;

typedef struct
{
    int b;
    String str_b;
}Config_BB;

typedef struct
{
    int c;
    String str_c;
}Config_CC;

typedef struct
{
    Config_AA m_AA;
    Config_BB m_BB;
    Config_CC m_CC;
}Config;

Config m_Config;

定义一个全局变量Config m_Config;其中包含类string。
如果变成
typedef struct
{
union{
    Config_AA m_AA;
    Config_BB m_BB;
    Config_CC m_CC;
}m_data;
}Config;

会因为union包含了string构造函数,导致union无法初始化内存而报错。
那么为什么使用结构体就不会报错,使用malloc(mun*sizeof(m_Config));的时候分配了多大的空间?
如果包含有类的绝结构体不能使用malloc分配空间,应该怎么分配空间初始化?
如何把c语言习惯上的全局变量嵌套形式的结构体使用C++的全局类的形式表示?
搜索更多相关主题的帖子: 结构体 typedef String 包含 全局 
2020-10-11 10:59
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
得分:40 
当 union 内部存在具有 non-trivial 构造函数的成员, union 的构造函数会被编译器指定为被删除的函数
union 的构造和解构都比较复杂, 需要使用一个标记, 标记哪个成员被使用, 如果是非 POD 类型的话, 是需要明确建构和解构的
程序代码:
class Union {
    private:
        enum {STRING, INT, CHAR, DOUBLE} token;
        union {
            std::string str;
            int i;
            char c;
            double d;
        };
    private:
        void copy(const Union &rhs) {
            switch(rhs.token) {
                case STRING:
                    new (&this->str) std::string(rhs.str);
                    break;
                case INT:
                    this->i = rhs.i;
                    break;
                case CHAR:
                    this->c = rhs.c;
                    break;
                default:
                    this->d = rhs.d;
                    break;
            }
        }
    public:
        constexpr Union() noexcept : token {INT}, i {} {}
        Union(const Union &rhs) : token {rhs.token} {
            this->copy(rhs);
        }
        Union &operator=(const Union &rhs) {
            if(this->token == STRING and rhs.token not_eq STRING) {
                this->str.~string();
            }else if(this->token == STRING and rhs.token == STRING) {
                this->str = rhs.str;
                return *this;
            }
            this->copy(rhs);
            this->token = rhs.token;
            return *this;
        }
        Union &operator=(std::string str) {
            if(this->token == STRING) {
                this->str = std::move(str);
                return *this;
            }
            new (&this->str) std::string(std::move(str));
            this->token = STRING;
            return *this;
        }
        Union &operator=(char c) {
            if(this->token == STRING) {
                this->str.~string();
            }
            this->c = c;
            this->token = CHAR;
            return *this;
        }
        //和 Union &operator=(char); 一样
        Union &operator=(int i);
        Union &operator=(double d);
};
2020-10-11 13:21
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
得分:0 
二楼只是解答了第一个问题,还有下面三个问题是什么情况?

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2020-10-17 07:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-503422-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.060453 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved