【问题标题】:Why do Ineed to declare a pointer and not an object?为什么需要声明一个指针而不是一个对象?
【发布时间】:2015-01-14 16:45:57
【问题描述】:

我正在使用CMapStringToOb 来存储CMapStringToString

如果我将columns 声明为*columns,我可以完成这项工作,但我想知道为什么我不能以这种方式工作

CMapStringToOb m_FfMasters;
CMapStringToString columns;
// if we haven't met this master before store the details for later use
if(!m_FfMasters.Lookup(_T("String"),(CObject*&)columns) )
{

    getColumns(_T("String"),columns);

    m_FfMasters.SetAt(_T("String"),(CObject*&)columns);
    if(m_FfMasters.Lookup(m_workingFfMaster,(CObject*&)columns))
    {
        CString temp;
        if(columns.Lookup(_T("String"),temp)) //<-- access violation here
        {
            return temp;
        }
    }
}

其他函数原型是:

void CClass::getColumns(CString code, 
                        CMapStringToString& columns, 
                        BOOL reverseKeyValue);

我在列查找时遇到访问冲突

【问题讨论】:

  • columns = new CMapStringToString(); 这是什么?
  • new 返回一个指针。
  • 对不起,这是一个令人困惑的问题,我该如何关闭它?

标签: c++ visual-studio-2010 pointers reference mfc


【解决方案1】:

因为你在这里分配了一个指向columns 的指针:

columns = new CMapStringToString();

【讨论】:

    【解决方案2】:

    如果您问为什么您的编译器需要指针,请使用 Paul 的答案。如果您问为什么要使用指针应该(您并不完全理解指针),那么答案是:
    因为您正在编写一个函数,该函数使用一个尚不存在的对象作为CClass 类定义中的参数 CMapStringToString columns 直到运行时才会创建。所以为了让函数使用这个对象,你必须说使用“this”(参考)CMapStringToString 对象,我稍后会给你。然后使用 -> 运算符访问引用的对象成员。

    【讨论】:

    • 我在问:为什么它需要指针。我承认没有完全理解指针。我上次在 6 年前在基本的 ansi C 中使用它们,然后转移到 java 现在试图维护旧的 c++ 代码
    • 这个块返回temp到什么函数?
    【解决方案3】:

    因为 CMapStringToOb 需要一个指向 CObject 的指针作为它的“数据”。

    来自 MSDN:

    CMapStringToOb 是一个字典集合类,将唯一的 CString 对象映射到 CObject pointers

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 2020-01-22
      • 1970-01-01
      相关资源
      最近更新 更多