2016-11-10 8 views
0

Моего синглтона какошибка именующие при использовании одноточечно содержат массив указателя

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; 

Я получаю сообщение об ошибке: требуется именующая ... Как это решить. Помоги мне. Thank & rg.

ответ

0

То, что вы создали, фактически не соответствует идиоматическому Singleton Pattern. Давайте посмотрим:

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 
}; 

Как вы хотите работать на Singleton, вам нужно сохранить состояние в пределах этого одного класса.

Таким образом, вы должны вернуться членов класса манипулировать как ссылки:

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

Кроме того, ваш Singleton реализация должна явным образом запретить создание копий этого класса:

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

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

ValueLstNode& m_ValueLstNode = ValueLstNode::GetInstance(); 

Хотя, я не полностью получил случай использования Singleton Pattern, применяемый к вашему наименованию. Семантика чувствует себя сломанной.

Не знаю, как это имеет смысл ValueLstNode должно быть Singleton. Вы хотели создать Factory Pattern?

+0

спасибо. он работает –

+0

Контрактор и копии являются общедоступными, ошибка уведомления затмений. Я не могу заниматься частным дизайнером и копиями. –