2011-12-31 2 views
0

Там является определение класса и некоторые функции BOOL, которые испытывают некоторые атрибутыработа с стандом :: BitSet

class MemCmd 
    { 
     friend class Packet; 
     public: 
     enum Command 
     { 
      InvalidCmd, 
      ReadReq, 
      ReadResp, 
      NUM_MEM_CMDS 
     }; 
     private: 
     enum Attribute 
     { 
      IsRead,   
      IsWrite,    
      NeedsResponse, 
      NUM_COMMAND_ATTRIBUTES 
     }; 

     struct CommandInfo 
     { 
      const std::bitset<NUM_COMMAND_ATTRIBUTES> attributes; 
      const Command response; 
      const std::string str; 
     }; 
     static const CommandInfo commandInfo[]; 
     private: 
     bool 
     testCmdAttrib(MemCmd::Attribute attrib) const 
     { 
      return commandInfo[cmd].attributes[attrib] != 0; 
     } 
     public: 
     bool isRead() const   { return testCmdAttrib(IsRead); } 
     bool isWrite() const  { return testCmdAttrib(IsWrite); } 
     bool needsResponse() const { return testCmdAttrib(NeedsResponse); } 
    }; 

Вопрос заключается в том, как я могу установить NeedsResponse к истинному или ложному перед вызовом needsResponse()

Пожалуйста обратите внимание, что attributes имеет тип std::bitset

UPDATE:

Я написал эту функцию:

void 
setCmdAttrib(MemCmd::Attribute attrib, bool flag) 
{ 
    commandInfo[cmd].attributes[attrib] = flag; // ERROR 
} 

void setNeedsResponse(bool flag) { setCmdAttrib(NeedsResponse, flag); } 

Но я получаю эту ошибку:

error: lvalue required as left operand of assignment 
+0

У вас есть методы, которые получают состояние различных бит в 'bitset'. Почему бы вам просто не добавить некоторые методы для настройки состояния различных битов? Или я пропущу точку вопроса? –

+0

Вы правы. Как я могу это сделать? можете ли вы дать фрагмент? – mahmood

+0

Это домашнее задание? Если это так, подсказка, которую я бы дал, это то, что они, вероятно, будут очень похожи на 'testCmdAttrib()'. –

ответ

1

Из комментариев:

Есть две проблемы

  1. членов данных то есть const должен быть инициализирован ed в конструкторе класса.
  2. Если число членов const не доступно для последующего использования.

Итак, инициализируйте (по крайней мере) элементы, которые должны иметь постоянное значение. Удалите const от членов, которые вы собираетесь изменить позже.