为啥需要声明一个指针而不是一个对象?

Posted

技术标签:

【中文标题】为啥需要声明一个指针而不是一个对象?【英文标题】: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 返回一个指针。 对不起,这是一个令人困惑的问题,我该如何关闭它? 【参考方案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

【讨论】:

以上是关于为啥需要声明一个指针而不是一个对象?的主要内容,如果未能解决你的问题,请参考以下文章

c#里为啥有的使用时函数需要new一个对象而有的不用?为啥不直接调用就好?

为啥宁愿使用指向结构的指针而不是链表中的常规结构类型变量?

动态数组 C++,新 Obj[size] 的麻烦只创建 1 个对象指针,而不是数组

结构体变量 和 结构体指针

序列化指针本身而不是目标对象

试图学习指针,为啥要使用它们而不是 &?