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 балла:
- Когда переменная объявлена, последующее
=
не является оператором присваивания, а предназначен для построения объекта. - Компилятор C++ допускает только 1 конструктор одновременно.
Имея это в виду, посмотрите на проблемный код:
MySet C(1,10) = "hello";
Это объявляет и объект MySet
и строит его с (1,10)
,
Теперь нет смысла использовать другую конструкцию, используя = "hello"
что бы пересилить существующую конструкцию.
Вот почему ошибка.