【问题标题】:c++, pointers, references, passing from one to another function, std::vector, std::stringc++,指针,引用,从一个函数传递到另一个函数,std::vector,std::string
【发布时间】:2011-08-18 14:02:16
【问题描述】:

我对指针和引用有一个特定的问题,包括 std::vector 和 std::string。一些问题在以下代码中被剪断,一些在下面。

我基本上有这个代码

//first of all: is this function declaration good?
//or shoudl I already pass the std::vector in another way?
//I'm only reading from it
void func(const std::vector<std::string>& vec)
{
    //I need to call otherFunc(void*) with  a single element from vec:
    //otherFunc(void* arg);
    //with arg being a void* to vec[0]
}

我的 IDE 告诉我只有 &amp;*vec[0] 可以作为 otherFunc 的参数,但这不能编译...

如何进行此类参数传递的最佳方式是?

【问题讨论】:

  • 你需要解释你想要传递给函数的内容。 “void *”本身是没有意义的。要使用“void *”,您必须先将其转换为其他类型。那么,“void *”的作用是什么?
  • 我不知道,因为它来自外部库。我不能改otherFunc(void*),只能改我自己的func()

标签: c++ string pointers vector reference


【解决方案1】:

这是一个很好的声明,只要函数不打算修改向量。它比按值传递更有效,因为它避免了复制向量——这是一项需要内存分配的昂贵操作。

但是,另一个函数需要一个非常量指针。如何处理取决于它是否可能修改数据。

如果它不会(正如你所说的“我只是在阅读它”时所暗示的那样),那么选项是:

  • 将其更改为 otherFunc(void const * arg) 以更强有力地保证它不会,或者
  • 调用时删除带有const_cast&lt;void*&gt;const 限定

注意&amp;*vec[0] 不会编译;您希望 vec[0].c_str() 获得指向第一个字符串数据的 C 兼容指针,假设这是您需要的。

如果它可能会修改向量,那么您将不得不做其他事情,因为没有合法的方法可以通过指向其数据的指针来修改 std::string。可能最好的选择是使用std::vector&lt;char&gt; 而不是std::string,但这取决于函数的具体功能。

【讨论】:

    【解决方案2】:

    首先,由于您只从向量中读取,因此将其作为const 引用传递是一个好主意,应该可以正常工作。

    关于你的第二个问题:很难说otherFunc 会对你的对象做什么,因为它需要一个void 指针。这是 C 风格,不应该在 C++ 中使用,有更好的和类型安全的方法来做到这一点。

    【讨论】:

      【解决方案3】:

      首先,&amp;*vec[0] 没有意义;您可能是指&amp;vec[0](即向量中第一个字符串的地址)。

      但即使这样也不会编译,因为&amp;vec[0]const std::string * 类型。最重要的是,它是const。你可以这样做:

      otherFunc(const_cast<std::string *>(&vec[0]));
      

      但是!!! 尝试在void * 的上下文中使用const std::string * 听起来是个非常糟糕的主意。这怎么可能做任何有用的事情?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-13
        • 2012-09-10
        • 2013-02-15
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多