2011-08-18 102 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++中使用,有更好的和安全的方式來做到這一點。

相關問題