C++ c++;,指针,引用,从一个函数传递到另一个函数,std::vector,std::string
我对指针和引用、std::vector和std::string有一个特殊的问题。以下代码中有一些问题被截取,下面有一些 我基本上有这个代码C++ c++;,指针,引用,从一个函数传递到另一个函数,std::vector,std::string,c++,string,pointers,vector,reference,C++,String,Pointers,Vector,Reference,我对指针和引用、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&
//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]
}
//首先:这个函数声明好吗?
//或者我应该用另一种方式传递std::vector吗?
//我只是在读它
void func(常量标准::向量和向量)
{
//我需要使用vec中的单个元素调用otherFunc(void*):
//otherFunc(void*arg);
//arg为空*至向量[0]
}
我的IDE告诉我,只有和*vec[0]
可以作为其他函数的参数,但这不会编译
这种参数传递的最佳方式是什么?首先,&*vec[0]
是没有意义的;您可能是指&vec[0]
(即向量中第一个字符串的地址)
但即使这样也无法编译,因为&vec[0]
的类型是const std::string*
。最重要的是,它是const
。您可以这样做:
otherFunc(const_cast<std::string *>(&vec[0]));
otherFunc(const_cast(&vec[0]);
但是试图在void*
的上下文中使用const std::string*
听起来是个非常糟糕的主意。那怎么可能有用呢?首先,&*vec[0]
毫无意义;您可能是指&vec[0]
(即向量中第一个字符串的地址)
但即使这样也无法编译,因为&vec[0]
的类型是const std::string*
。最重要的是,它是const
。您可以这样做:
otherFunc(const_cast<std::string *>(&vec[0]));
otherFunc(const_cast(&vec[0]);
但是试图在void*
的上下文中使用const std::string*
听起来是个非常糟糕的主意。这怎么可能有用呢?首先,因为您只读取向量,所以将其作为常量
引用传递是一个好主意,应该可以很好地工作
关于第二个问题:很难说otherFunc
会对对象做什么,因为它需要一个void
指针。这是C++风格,不应该在C++中使用,有更好的和类型安全的方法。 首先,因为您只从vector中读取,将其作为<代码> const >引用是一个好主意,并且应该工作得很好。
关于第二个问题:很难说otherFunc
会对对象做什么,因为它需要一个void
指针。这是C风格,不应该在C++中使用,有更好的和类型安全的方法来做。 这是一个很好的声明,只要函数不打算修改向量。它比按值传递更有效,因为它避免了复制向量——这是一个需要内存分配的昂贵操作
但是,另一个函数需要一个非常量指针。如何处理此问题取决于它是否可能修改数据
如果它不会(正如你说的“我只是在读它”)那么选项是:
- 将其更改为
otherFunc(void const*arg)
,以提供更有力的保证,确保它不会更改,或者
- 调用
const_cast
时,使用const_cast
删除const限定符
请注意,和*vec[0]
不会编译;您需要vec[0].c_str()
获取指向第一个字符串数据的c兼容指针,前提是您需要该指针
如果它可能修改向量,那么您必须做一些其他的事情,因为没有合法的方法通过指向其数据的指针修改std::string
。最好的选择可能是使用std::vector
而不是std::string
,但这完全取决于函数的功能。这是一个很好的声明,只要函数不打算修改向量。它比按值传递更有效,因为它避免了复制向量——这是一个需要内存分配的昂贵操作
但是,另一个函数需要一个非常量指针。如何处理此问题取决于它是否可能修改数据
如果它不会(正如你说的“我只是在读它”)那么选项是:
- 将其更改为
otherFunc(void const*arg)
,以提供更有力的保证,确保它不会更改,或者
- 调用
const_cast
时,使用const_cast
删除const限定符
请注意,和*vec[0]
不会编译;您需要vec[0].c_str()
获取指向第一个字符串数据的c兼容指针,前提是您需要该指针
如果它可能修改向量,那么您必须做一些其他的事情,因为没有合法的方法通过指向其数据的指针修改std::string
。最好的选择可能是使用std::vector
而不是std::string
,但这完全取决于函数的功能。您需要解释要传递给函数的内容。“空虚”本身是没有意义的。要使用“void*”,必须先将其转换为其他类型。那么,函数将如何处理“void*”?我不知道,因为它来自外部库。我无法更改otherFunc(void*)
,我只能更改我自己的func()
。您需要解释要传递给函数的内容。“空虚”本身是没有意义的。要使用“void*”,必须先将其转换为其他类型。那么,函数将如何处理“void*”?我不知道,因为它来自外部库。我不能更改otherFunc(void*)
,我只能更改我自己的func()
。