1

この答えが明らかである必要がある場合はお詫びします。おそらくこれには「ドープ割り当てオーバーロード」のようなパターン名があり、適切なトピックで検索されていません-最も歓迎されるコード抽出をリダイレクトします:

class MySet {
        private:
                int lower;
                int upper;
                char *data;
        public:
                MySet( int l, int u, const char *val = 0 );

                MySet &operator=( MySet &rhs );
                MySet &operator=( const char *val );
};

int main(int i, const char *argv[])
{
        MySet A(1,10);
        A = "hello";

        MySet B(1,10, "hello");
        MySet C(1,10) = "hello";

}

A と B の代入は機能しますが、C の場合は g++ 泣き言を言う....: myset.cxx:19:16: エラー: 期待される ',' または ';' 「=」トークンの前

は大きな問題ではありませんが、なぜ無効なのかを理解しようとしています。

役に立つ返信をありがとう。

詳細... 私の操作を編集するためのものだと思いますか?

上記が違法と見なされる理由を突き止めて、決定的な理由を探していました...そしてもちろん、そのような表記法をコンパイラーに受け入れさせるためのトリック.

合法的な同様の使用を検討する

struct toons {
     char first[10];
} flintstone[] = {
     "fred",
     "wilma",
     ""
};

次のように、数十年の C コンパイラから動作します。

typedef struct {
    char family[10];
    struct {
            char name[10];
    } members[6];
} toongroup;

toongroup rubble = {
    "rubble",
    {
            "barney",
            "wilma",
            ""
    }
}

toongroup rubble = {
    "rubble",
    {
            "barney",
            "wilma",
            "", "", "", ""
    }
};

toongroup jetsons = { "jetson", { "george", "jane", "", "", "", "" } };

すべて c++ コンパイラによって尊重されます。構造体にメンバー関数を含めることができ、引き続き機能します。

typedef struct toongroup {
    public:
            bool add( const char *newbaby ) {
                    for(int i; i<6; i++) {
                            if(strlen(members[i].name) == 0) {
                                    strcpy(members[i].name, newbaby);
                                    return true;
                            }
                            if(strcmp(members[i].name, newbaby) == 0)
                                    return false;
                    }
                    return false;
            }
    char family[10];
    struct {
            char name[10];
    } members[6];
} toongroup;

toongroup jetsons = { "jetson", { "george", "jane", "", "", "", "" } };

jetsons.add( "elroy" );

コンストラクターを追加すると、反対意見が始まります。

typedef struct toongroup {
    toongroup( const char *f, const char *m, ... ) {
    }


error: in C++98 ‘rubble’ must be initialized by constructor, not by ‘{...}’
error: could not convert ‘{"rubble", {"barney", "wilma", "", "", "", ""}}’ from ‘&lt;brace-enclosed initializer list>’ to ‘toongroup‘

コンパイラーがコンストラクターと一致できるように、適切な初期化子を使用することが問題になるのではないかと考えています

    toongroup empty;
    toongroup nobody = empty;
    toongroup rubble( "rubble", "barney", "wilma", "" );

    toongroup empty;
    toongroup cancelled;
    toongroup nobody = empty;
    toongroup rubble( "rubble", "barney", "wilma", "" );
    toongroup jetsons( "jetson", "george", "jane", "" );

    jetsons.add( "elroy" );

追加

    toongroup &operator=( toons &t );

許可します

    jetsons = cancelled;

だがしかし

    toongroup jetsons( "jetson", "george", "jane", "" ) = cancelled;

これが長い投稿になってしまったことをお詫びしますが、コンストラクターと割り当てが拒否される理由と、これに対応できるかどうかについてのアイデアを探しています。

MySet の表記法では、これはおなじみのステートメントになりますが、違法であると宣言する前に、トリックがないかどうかを確認したかったのです。

ありがとう。

4

3 に答える 3

3

なぜなら

MySet C(1,10) = "hello";

違法です。変数を初期化するときは、代入などを呼び出すことはできません。

それが機能した場合=、 は代入ではなく初期化を表します。

と同じように:

int x = 5;  //initialization, not assignment

と同等です

int x(5);

そしてそうではない

int x;
x = 5;
于 2012-04-30T08:32:59.497 に答える
1

問題は、あなたが書くとき:

MySet C = "hello";

実際には、代入演算子ではなく、文字配列のコンストラクターが呼び出されます(存在する場合)。したがって、コードでは、コンパイラーを混乱させます。2つのコンストラクターのどちらを呼び出すかです。

基本的に、宣言行の等価性はコンストラクター呼び出しに変換されます。それ以降、代入演算子が使用されます。

于 2012-04-30T08:35:34.173 に答える
0

2つのポイントを覚えておいてください:

  1. 変数が宣言されると、後続=代入演算子ではなく、オブジェクトの構築を目的としています。
  2. C ++コンパイラでは、一度に1つのコンストラクタのみが許可されます。

それらを念頭に置いて、問題のあるコードを見てください。

MySet C(1,10) = "hello";

これは、のオブジェクトを宣言し、MySetそれをで構築し(1,10)ます。
現在、既存の構造を圧倒するような別の構造を使用する意味はありません。 そのため、エラーが発生します。= "hello"

于 2012-04-30T08:35:42.553 に答える