C ++:带有“const指针”作为成员的列表VS带有“指向const的指针”作为成员的列表

时间:2013-05-27 01:28:06

标签: c++ list pointers mfc const

如果有人提出这个问题我很抱歉。

我知道“const指针”与“指向const的指针”之间的含义和语法差异。

char * const myPtr;是一个“const指针”,不能用作“myPtr =& char_B;”

const char * myPtr;是“指向const的指针”,不能用作“* myPtr ='J';”

如果我正在使用MFC的容器,http://msdn.microsoft.com/en-us/library/fw2702d6%28v=vs.71%29.aspx

我想听听你对我的陈述的评论:

  1. CObList或CPtrList无法满足我的要求,对吗?
  2. 我的第一个想法是使用CTypedPtrList,例如:

    CTypedPtrList表示一个包含“const指针”成员的列表。

  3. 这实际上有效但“没用”:

    class CAge
    {
    public:
        int   m_years;
        CAge( int age ) { m_years = age; }
    };
    
    CTypedPtrList<CPtrList, CAge* const> list;
    list.AddTail(new CAge(10));
    list.AddTail(new CAge(5));
    
    POSITION pos = list.GetHeadPosition();
    while(pos)
    {
        CAge* a = (CAge*)list.GetNext(pos);
        a = new CAge(11);  //That's why I say it is "useless", because the returned value can be assigned
    
        list.GetNext(pos) = new CAge(11);   //Expected, can not pass compile
    }
    
    1. 但是,CTypedPtrList不起作用。我想要一个带有“const指针”成员和更多内容的列表。

      CTypedPtrList<CPtrList, const CAge*> list2;
      //list2.AddTail(new CAge(10));          //Help! This does not pass compile, then how to initialize list2???
      //list2.AddTail(new CAge(5));
      
      POSITION pos2 = list2.GetHeadPosition();
      while(pos2)
      {
          CAge* a = (CAge*)list2.GetNext(pos2);
          a->m_years = 50;    //This passed compile. That's why I say "MORE".
      
          //((CAge*)list2.GetNext(pos2))->m_years = 50;       //This passed compile (because of type cast)
          //((const CAge*)list2.GetNext(pos2))->m_years = 50; //this does not pass compile (because of type cast as well)
      }
      
    2. 实际上,对于上面的场景,我实际上想要一个“魔术”列表。如果一个指针(非常量指针)被添加到这个“魔法”列表中,那么稍后从列表中检索指针将是一个“常量指针”,不能使用指针来改变指向对象的内容。

    3. 问题:如何定义“魔术”列表?

1 个答案:

答案 0 :(得分:0)

强制新对象const是不可能的。类型系统仅确保对旧对象的引用/指针保持const

至于CAge* a = (CAge*)list2.GetNext(pos2);,只需删除演员。强制转换打破了类型系统(实际上这是强制转换的重点),所以你不应该对它们允许你通过const引用路径修改对象感到惊讶。