传递指针向量的指针...不不?

Posted

技术标签:

【中文标题】传递指针向量的指针...不不?【英文标题】:Passing Pointer of vector of pointers... no no? 【发布时间】:2011-04-20 15:18:39 【问题描述】:

C++ 新手,它让我很兴奋。

实际代码在另一台计算机上,我无法复制它,所以我会尽力使用伪代码。

我的最终目标是拥有一个可以被多个不同对象访问的 [指针] 向量。我试图解决这个问题的方法是让包含向量的原始类有一个类似的方法:

std::vector<myObject*>& myClass::getVectorPointer()
 return &vectorPointer;

那么我的各种类最终都会有这样一行代码:

std::vector<myObject*>* myStuff = myClassObject.getVectorPointer();

然后我想开始将对象扔进向量中。所以首先我实例化一个对象:

MyObject* tempObject = new MyObject("grrr");

然后我想把它放在向量中,所以我这样做了:

myStuff->push_back(tempObject);

这编译得很好,但是当我运行它时会阻塞。通过调试器我得到:

402 [some_]allocator::construct 中的新表达式错误

我不知道这意味着什么。我尝试将 :: 放在我的 new 前面,就像建议的解决方案中所说的那样,但这并没有做到。

所以,回顾一下,假设它是这样的,但语法和逻辑正确:

Class A.h
#include <vector>
#include "myObject.h"

ClassA
public:
    classA();

    inline std::vector<myObject*>* myClass::getVectorPointer() return &vectorPointer;


private:
    std::vector<MyObject*>* vectorPointer;


#include "A.h"


int main() 

ClassA myClassAObject;  
std::vector<myObject*>* myStuff = myClassAObject.getVectorPointer();  
MyObject* tempObject = new MyObject("grr");  
myStuff->push_back(tempObject);  


产量 402。

这只是一个简单的语法问题,还是因为指向指针向量的指针只是一个禁忌?

我一直在尝试了解如何传递向量,虽然我看到的大多数事情都显示调用一个接收 &vector 并对函数中的向量进行处理的函数,但我不明白这是怎么回事与调用返回引用然后对那里的向量进行处理的函数有很大不同。这只是我的一个巨大的逻辑缺陷吗?

任何线索我可以如何修复我的程序到什么是正确的,非常快?


我将尝试建议的事情。你们都非常有帮助。非常感谢!

【问题讨论】:

指向指针向量的指针是合法的 c++ - 但不一定是最好的设计。您的 ClassA 构造函数大写正确吗? 可以添加class MyObject的声明吗? 【参考方案1】:

在上面的代码中,vectorPointer 永远不会被分配/分配。

通常最好返回引用而不是指针,因为它们不能为空。

  Class A.h
#include <vector>
#include "myObject.h"

ClassA
public:
    classA();

    inline std::vector<myObject*>& myClass::getVectorPointer() return vectorPointer;


private:
    std::vector<MyObject*> vectorPointer;

【讨论】:

为您修复了格式。使用引用而不是指针的原因有很多,但不幸的是,这是使用指针而不是引用的原因。 删除了这个,因为太晚了,我要疯了 @Potatoswatter - 我有点困惑(没什么新鲜的)。那么如果vectorPointer 是一个向量,并且只返回“vectorPointer”就会返回对它的引用?它不会是 vectorPointer 或 &vectorPointer?我通常会摸索整个 */& 的东西,但是当我不得不开始将它们发送到其他地方时,我的大脑似乎冻结了。 *sigh -- 在我尝试找出转义字符时进行编辑.... @Amber:引用只是对象的别名。因此,引用引用尽可能接近将对象作为局部变量并仅使用它。用语言设计者的话说,“引用就是所指的”。 (另一方面,你永远不应该返回对本地对象的引用,因为它会被销毁,然后调用者会假装它仍然存在。像这里一样返回对类成员的引用是可以的。) 好吧,看起来你的提议是我试图做但失败的事情。我会看看情况如何。如果我这样做,它是否有机会尝试大量复制我的矢量?【参考方案2】:

我认为你想让你的 vectorPointer 只是一个向量,而不是一个指向向量的指针。当你返回一个指针时,你实际上是在返回一个指向指针的指针。

【讨论】:

【参考方案3】:

指针向量或指向指针向量的指针没有任何违法之处。

在您的代码中,虽然您返回的是指向向量的指针的地址,而不是指向向量的指针。

【讨论】:

【参考方案4】:

可以将 C++ 容器库(或 STL,包括 vector)视为现有的,以保护您免受指针错误和重新实现数据结构的苦差事。因此,尽管您编写的是合法的 C++(无论如何都已编译),但您似乎犯了某种指针错误。

我建议尽可能用普通对象和引用替换指针,以简化代码并让 C++ 为您完成工作,同时(或作为一种方法)尝试查找指针错误。

【讨论】:

我唯一担心的是,如果你不以正确的方式传递你的向量,是不是会发生一些事情呢? @Amber:要制作副本,您需要声明一个新变量(非引用类型)来接收副本,或者按值返回。 (并且按值返回实际上很少会复制;通常您返回一个与返回值相同的局部变量。)无论如何,不​​要担心在程序工作之前对其进行优化;v)。 先把它做好——只有在分析表明你应该做的时候才担心优化副本

以上是关于传递指针向量的指针...不不?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 通过引用传递向量字符指针

通过指针在函数之间传递向量

将派生类指针的向量传递给线程

C++ 指针向量,传递次数过多?

如何将向量传递给函数参数(我需要指针吗?)

将指针向量传递给c ++中的函数[重复]