繁体   English   中英

C ++,指针,引用,从一个函数传递到另一个函数,std :: vector,std :: string

[英]c++, pointers, references, passing from one to another function, std::vector, std::string

我在使用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告诉我,只有&*vec[0]用作otherFunc参数,但这不能编译...

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

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

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

如果不会(如您所暗示的那样,当您说“我只是从中读取”)时,这些选项为:

  • 将其更改为otherFunc(void const * arg)可以更otherFunc(void const * arg)保证它不会,或者
  • 调用时使用const_cast<void*>删除const限定符

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

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

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

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

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

但!!! void *的上下文中尝试使用const std::string * void *听起来是一个非常糟糕的主意。 那怎么可能有用呢?

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

关于第二个问题:很难说otherFunc将对您的对象做什么,因为它期望一个void指针。 这是C样式,不应在C ++中使用,这样做有更好的类型安全方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM