3

これにより、エラーが発生します:「const char *」から「char *」に変換できません。

class Mock
{
public:
    ...
    static void func(char **result)
    {
          *result = (resultsI++)->c_str();
    }
static std::vector<std::string> results;
static std::vector<std::string>::iterator resultsI;
};

std::vector<std::string> Mock::results;
std::vector<std::string>::iterator Mock::resultsI;

関数 func へのインターフェイスを変更せずに、このエラーを有効に取り除くにはどうすればよいですか? このインターフェースの実装者:

void (func*)(char **result) 

シグネチャで const char** を使用するのを忘れていました。変更できません。

これはモックであり、単体テストでのみ使用されることを忘れないでください。

4

3 に答える 3

6

試す:

*result = &(*resultsI++)[0];

これは C++11 より前のバージョンで動作することは保証されていませんが、現在のほとんどまたはすべてのコンパイラで問題なく動作することが知られています。

危険なのは、関数が文字列の長さを変更しようとすると、厄介なエラーが発生する可能性があることです。個々の文字を変更しても問題ありません。

于 2012-11-16T16:25:05.690 に答える
4

テスト コードで、インターフェイスのユーザーが char* を変更しないことが確実なconst_cast場合は、 ?を使用できます。

char *これは、呼び出し元が;の所有権を取得しないことを前提としています。その場合は、コピーを作成する必要があります。

于 2012-11-16T16:24:15.220 に答える
4

インターフェイス関数が文字列を変更しないことが絶対に確実な場合は、次を使用できます

*result = const_cast<char *>((resultsI++)->c_str());

constネスを取り除く。

std::vector<std::string>それ以外の場合は、to の使用から切り替える別のオプションがありstd::vector<std::vector<char>>ますが、文字列を適切に null で終了するようにする必要があります。

于 2012-11-16T16:24:54.770 に答える