2012-03-05 50 views
0

這可能是一個新手問題,但我無法解決此問題。我可以分別解決前者或後者的問題,但不能同時解決。將字符串文字傳遞到函數並分配給成員變量

我有一個字符串成員的類和一個函數來設置它。我想傳遞一個文字給函數。

class Profiler 
{ 
private: 
    std::string description; 
    //snip 

public: 
    //snip 
    void startJob(const std::string &desc); 
}; 

void Profiler::startJob(const string &desc) { 
    //snip 
    description = desc; 
} 

,我想(實際上需要)用這樣的:

profiler.startJob("2 preprocess: 1 cvConvertScale"); 

的問題是:

  • 如何傳遞一個字符串字面到一個函數?解決方案我可以找到:通過值傳遞或通過const指針或const引用傳遞它。我不想按價值傳遞它,因爲它很慢(它畢竟是一個分析器,精確到微秒)。常量指針/參考給編譯器錯誤(或者我做錯了什麼?)

  • 如何將它分配給成員函數?我能找到的唯一解決方案是使成員變量成爲一個指針。使它成爲非指針提供者錯誤「字段」描述「不完整類型」(wtf是否意味着?)。將它作爲指針不起作用,因爲它將一個const分配給非const。只有一個const指針/引用似乎工作。

+0

兩件事:1.爲了參考你需要一個實際的變量。所以'string arg =「2 preprocess:1 cvConvertScale」; profiler.startJob(arg);'2.你沒有正確地分配你的指針。 'description = &desc;' – chris 2012-03-05 07:22:23

回答

1

通過引用傳遞,由值存儲,包含頭:

#include <string> 

class Profiler 
{ 
    private: 
    std::string description; 
    //snip 

public: 
    //snip 
    void startJob(const std::string &desc); 
}; 

void Profiler::startJob(const string &desc) { 
    //snip 
    description = desc; 
} 

存儲由值爲O.K.只要你不修改原始字符串即可。如果你不這樣做,他們將共享內存,並且不會有低效率的副本。但是,在這種情況下,您將會將字符複製到由std :: string控制的緩衝區中。

我不認爲有可能將指針存儲爲literal-char *作爲std :: string的一個實例,儘管它會是o.k.存儲char *指針。

+0

使用'std :: string description;'給出前面提到的錯誤'field'description'has incomplete type'。我*要*希望他們共享內存,字符串是字面的,永遠不會改變。 – 2012-03-05 07:31:24

+0

我曾經通過'char *'傳遞和存儲,但只能在MSVC中,在MinGW中我得到錯誤,它想從const char *轉換爲char *(爲什麼MSVC不會給這個錯誤是一個謎我) – 2012-03-05 07:35:53

相關問題