2011-08-18 109 views
0

我有指针和引用与std :: vector和std :: string的具体问题。一些问题在下面的代码中被剪下,一些在下面。C++,指针,引用,从一个到另一个函数,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,但这并不编译...

如何是最好的方式做这些一种参数传递?

+0

你需要解释你想传递给函数的东西。它自己的“void *”是没有意义的。要使用“void *”,您必须首先将其转换为其他类型。那么,“void *”函数的功能是什么? – user9876

+0

我不知道,因为它来自外部库。我不能改变'otherFunc(void *)',我只能改变我自己的'func()'。 – blubberbernd

回答

2

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

但是,其他函数需要一个非const指针。如何处理这取决于它是否可能修改数据。

如果它不会(因为你,当你说:“我只是从它读”暗示),则有三种选择:

  • 将其更改为otherFunc(void const * arg)给予更有力的保证,它赢得了”调用它时T或
  • 取出const资格与const_cast<void*>

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

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

1

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

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

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

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

1

首先,由于您只能从矢量中读取,因此将其作为const引用传递是个不错的主意,应该可以很好地工作。

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

相关问题