0

如果有人问过这个问题,我深表歉意。

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

字符 * 常量 myPtr; 是“常量指针”,不能用作“myPtr = &char_B;”

常量字符 * myPtr; 是“指向 const 的指针”,不能用作“*myPtr = 'J';”

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

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

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

    CTypedPtrList 表示具有“常量指针”成员的列表。

这实际上有效但“无用”:

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 不起作用。我想要一个包含“指向常量的指针”成员和更多的列表。

    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. 实际上,对于上述情况,我实际上想要一个“魔术”列表。如果一个指针(非常量指针)被添加到这个“魔术”列表中,那么稍后从列表中检索的指针将是一个“常量指针”,不能使用指针来改变指向对象的内容。

问题:如何定义“魔法”列表?

4

1 回答 1

0

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

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

于 2013-05-27T02:22:35.717 回答