当使用单例包含指针数组时,左值错误

error lvalue when use singleton contain array of pointer

本文关键字:错误 数组 指针 单例包      更新时间:2023-10-16

My singleton like

class ValueLstNode {
private:
    ZwNode* m_pZwNode[32];
public:
    ValueLstNode();
    ValueLstNode(const ValueLstNode& rhs);
    static ValueLstNode& GetInstance();
    virtual ~ValueLstNode();
    ValueLstNode& operator= (const ValueLstNode& rhs);
    ZwNode_p GetNode    (int Posion) const;
    ZwNode_p operator[] (int Posion);
    const ZwNode_p operator[] (int byPosion) const;
};

和文件。cpp

ValueLstNode::ValueLstNode() {
    for (u32_t i = 0; i < 32; i++) {
        m_pZwNode[i] = NULL;
    }
}
ValueLstNode::ValueLstNode(
    const ValueLstNode& rhs
) {
    for (u32_t i = 0; i < 32; i++) {
        m_pZwNode[i] = rhs.m_pZwNode[i];
    }
}
ValueLstNode&
ValueLstNode::operator= (
    const ValueLstNode& rhs
) {
    for (int i = 0; i < ZW_MAX_NODES; i++) {
        m_pZwNode[i] = rhs.m_pZwNode[i];
    }
    return *this;
}
ValueLstNode::~ValueLstNode() {
    for (int i = 0; i < ZW_MAX_NODES; i++) {
        if (m_pZwNode[i] != NULL) {
            delete m_pZwNode[i];
            m_pZwNode[i] = NULL;
        }
    }
}
ValueLstNode&
ValueLstNode::GetInstance() {
    static ValueLstNode m_instance;
    return m_instance;
}
ZwNode*
ValueLstNode::operator[] (
    int Posion
) {
    return m_pZwNode[Posion];
}
const ZwNode*
ValueLstNode::operator[] (
    int Posion
) const {
    return m_pZwNode[Posion];
}

,

ValueLstNode m_ValueLstNode = ValueLstNode::GetInstance();
m_ValueLstNode[0] = NULL;

我得到错误:lvalue required…如何解决这个问题。帮助我。谢谢,rg。

您创建的内容实际上并不符合惯用的单例模式。让我们看看:

class ValueLstNode {
   // ...
public:
    ValueLstNode(); // You allow pulic construction of new instances
    ValueLstNode(const ValueLstNode& rhs); // You allow new instances as copies 
    static ValueLstNode& GetInstance();
    virtual ~ValueLstNode();
    ValueLstNode& operator= (const ValueLstNode& rhs); // Well, may be the right intend,
                                                       // but not really idiomatic for a 
                                                       // singleton
    ZwNode_p GetNode    (int Posion) const;            // You return copies of your 
                                                       // internally managed elements?
    ZwNode_p operator[] (int Posion);                  // ^^^^ That
    const ZwNode_p operator[] (int byPosion) const;    // ^^^^ That
};

当你想在单例上操作时,你需要在这个类中保持状态。

所以你需要返回类成员作为引用来操作:

ZwNode_p& operator[] (int Posion);
const ZwNode_p& operator[] (int Posion) const;

而且你的单例实现应该明确地拒绝创建该类的副本:

class ValueLstNode {
    ValueLstNode(const ValueLstNode&) = delete;
    ValueLstNode& operator=(const ValueLstNode&) = delete;
};

和引用,如果你需要的话:

ValueLstNode& m_ValueLstNode = ValueLstNode::GetInstance();

虽然,我没有完全从你的命名中得到单例模式应用的用例。语义被打破了。

我不明白ValueLstNode应该是一个单例有什么意义。你的意思是创建一个工厂模式吗?