10

というクラスがありAStringます。それはかなり基本的です:

class AString
{
public:
    AString(const char *pSetString = NULL);
    ~AString();
    bool operator==(const AString &pSetString);
    ...

protected:
    char *pData;
    int   iDataSize;
}

今、私はこのようなコードを書きたいです:

AString *myString = new AString("foo");
if (myString == "bar") {
    /* and so on... */
}

ただし、既存の比較演算子はサポートするだけです

if (*myString == "bar")

そのアスタリスクを省略すると、コンパイラは不幸になります。

*AString比較演算子を比較できるようにする方法はありconst char*ますか?

4

5 に答える 5

12

ある種のスマートポインタクラスでラップしない限り、セマンティクスは奇妙になります。何が問題なのif (*myString == "bar")ですか?

于 2010-10-06T09:21:52.113 に答える
12

いいえ、ありません。

をオーバーロードoperator==するには、オペランドの1つとしてユーザー定義型を指定する必要があり、ポインター(AString*またはconst char*)は修飾されません。
また、2つのポインターを比較する場合、コンパイラーには非常に適切な組み込みが組み込まれているoperator==ため、引数の1つをクラス型に変換することは考慮されません。

于 2010-10-06T09:33:25.013 に答える
4

C ++の型システムを覆い隠してしまうので、あなたが望むものは間違っていると思います。myString へのポインタであり、ではAStringありませんAString。それがポインタであるという事実を隠そうとしないでください。これは醜いバグのエントリポイントであり、チームでコーディングしている場合、他のすべての人は混乱するだけです。

于 2010-10-06T09:22:00.163 に答える
3

[元の回答が間違っていたため、以下で修正されました]

オリ・チャールズワースが指摘したように、以下のコメントでは、これは不可能です。

次のような演算子を定義する必要があります

   bool operator==(const AString *as, const char *cs); // Note: C++ will not do that

ただし、パラメーターの1つが非プリミティブ型であり、ポインター(AStringへのポインターとcharへのポインターの両方)がプリミティブ型でない限り、演算子をオーバーロードすることはできません。

于 2010-10-06T09:21:15.530 に答える
3
 if (myString == "bar")

あなたがそれを機能させたとしても、他の人にとっては非常に混乱します。文字列リテラルを使用してオブジェクトへのポインタを比較しています。これを機能させるためのより明確な方法は、ポインターを逆参照し、次のようなオーバーロードを提供することです。

bool operator==(const char* pSetString);
于 2010-10-06T09:22:33.220 に答える