MySet(20,100) = "abcd"; копия и / или назначение?

Извините, если этот ответ должен быть очевидным, возможно, у него есть имя шаблона, например, "dopey assignment overload", и он не был найден по правильной теме - перенаправляет большинство полезных фрагментов кода:

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 ‘<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 это было бы знакомое утверждение, прежде чем я объявил его незаконным, хотел проверить, не хватает ли уловки.

Благодарю.

3 ответа

Так как

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

незаконно Вы не можете вызвать присваивание или что-либо еще, когда вы инициализируете переменную.

Если это сработало, = будет стоять для инициализации, а не назначения.

Как:

int x = 5;  //initialization, not assignment

эквивалентно

int x(5);

и не

int x;
x = 5;

Проблема в том, что когда вы пишете:

MySet C = "hello";

На самом деле вызывается конструктор из символьного массива (если таковой существует), а не оператор присваивания. Таким образом, с вашим кодом вы путаете компилятор: какой из двух конструкторов вызывать.

По существу, равенство в строке объявления преобразуется в вызов конструктора. С этого момента используются операторы присваивания.

Помните 2 балла:

  1. Когда переменная объявлена, последующее = не является оператором присваивания, а предназначен для построения объекта.
  2. Компилятор C++ допускает только 1 конструктор одновременно.

Имея это в виду, посмотрите на проблемный код:

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

Это объявляет и объект MySet и строит его с (1,10),
Теперь нет смысла использовать другую конструкцию, используя = "hello" что бы пересилить существующую конструкцию.
Вот почему ошибка.

Другие вопросы по тегам