声明字段为const调用"函数operator =(const memAddress&)无法引用 - 它是一个已删除的函数"

pok*_*ace 3 c++ oop

我有一个存储和操作内存地址的结构.我决定改变从领域之一int,以const int确保它是只读的,突然我定义的操作符- ()以下消息抱怨:

函数"memAddress :: operator =(const memAddress&)"(隐式声明)不能被引用 - 它是一个已删除的函数

这是代码,

struct memAddress
{
    // memory location variables
    int die = 0;
    int plane = 0;
    int page = 0;
    int column = 0;
    int block = _BLOCK_STARTING_ADDRESS;

    memAddress() {}

    memAddress(const memAddress &m)
    {
        die = m.die;
        plane = m.plane;
        page = m.page;
        column = m.column;
        block = m.block;
    }

    bool operator<(const memAddress &m)
    {
        if (die > m.die)
            return false;
        else if (die == m.die)
        {
            if (plane > m.plane)
                return false;
            else if (plane == m.plane)
            {
                if (block > m.block)
                    return false;
                else if (block == m.block)
                {
                    if (page > m.page)
                        return false;
                    else if (page == m.page)
                    {
                        if (column >= m.column)
                            return false;
                        else
                            return true;
                    }
                    else
                        return true;
                }
                else
                    return true;
            }
            else
                return true;
        }
        else
            return true;

    }

    bool operator==(const memAddress &m)
    {
        if (die == m.die &&
            plane == m.plane &&
            block == m.block &&
            page == m.page &&
            column == m.column)
        {
            return true;
        }

        return false;
    }

    bool operator<=(const memAddress &m)
    {
        if ((*this < m) || (*this == m))
            return true;

        return false;
    }

    bool operator>(const memAddress &m)
    {
        if (!(*this <= m))
            return true;

        return false;
    }

    bool operator>=(const memAddress &m)
    {
        if ((*this > m) || (*this == m))
            return true;

        return false;
    }

    memAddress operator-(const memAddress &m)
    {
        memAddress diff, a1, a2;

        if (*this < m)
        {
            a2 = m; // **error** 
            a1 = *this; // **error**
        }
        else
        {
            a2 = *this; // **error**
            a1 = m; // **error**
        }

        diff.die = a2.die - a1.die;
        diff.plane = a2.plane - a1.plane;
        diff.block = a2.block - a1.block;
        diff.page = a2.page - a1.page;
        diff.column = a2.column - a1.column;

        return diff;

    }

private:
    const int _BLOCK_STARTING_ADDRESS = 2; // **modifier added here**

};
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会这样 - 如果修改器被删除,代码工作正常.

为什么更改字段修饰符会const导致此行为?我该怎么办呢?

Sto*_*ica 7

您对所有大写字母的使用(以及使用它进行初始化block)表明您打算 _BLOCK_STARTING_ADDRESS成为所有实例的类常量.

首先,让它静止不动

static const int _BLOCK_STARTING_ADDRESS = 2;
Run Code Online (Sandbox Code Playgroud)

为什么?因为否则它是每个实例的数据成员.意味着每个实例都必须包含一小部分const,并且默认情况下不能分配给该const位.由于这个原因,编译器无法为您生成默认赋值运算符.

另外,作为一方而不是._[A-Z]以C++实现保留的名称保留给任何用途.为了避免鼻子恶魔的可能性,我建议你改变它的命名方案.也许甚至对一个少喊叫的人