2012-03-05 20 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参照渡し。私はそれが遅い(結局のところプロファイラで、マイクロ秒に正確です)ので、値渡ししたくありません。 Constポインタ/参照でコンパイラエラーが発生する(または何か間違っていますか)

  • メンバ関数に割り当てる方法は?私が見つけることができる唯一の解決策は、メンバー変数をポインタにすることです。それを非ポインタにすると、 "field 'description'の型に不完全なエラーが発生します(これは意味ですか?)。これをポインタとして持つことは、非constにconstを代入するので機能しません。 constポインタ/参照のみが動作するようです。

+0

2つのこと:1.参照のためには、実際の変数が必要です。だから 'string arg =" 2前処理:1 cvConvertScale "; profiler.startJob(arg); '2.あなたはポインタを正しく割り当てていません。 'description = &desc; ' – chris

答えて

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 'の記述に' incomplete typeを持つ'エラーが返されます。そして、私は彼らに記憶を共有したい、文字列は文字通りであり、決して変化しません。 –

+0

私は 'char * 'で渡して保存していましたが、MinGWではMSVCでしか動作しませんでしたが、const char *からchar *に変換しようとするエラーが発生します(MSVCがこのエラーを引き起こさない理由は謎です私) –

関連する問題