Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странный диалог GNU C++ ? 
:(
    Опции темы
sinoptic
Дата 28.9.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.9.2009

Репутация: нет
Всего: нет



GCC 4.0, C++

Следующий код не компилируется:

Код

    mystring str1, str2("string2");
    
    str1="string1"; // это проходит нормально

    str1=str2;    // это проходит нормально

    str1=str1+"12345";  // <-- ошибка компилирования: error : no match for 'operator=' in 'str1 = mystring::operator+(char*)(((char*)((const char*)"12345")))'


Знатоки С++ не могли бы вы подсказать что тут не правльно?
Этот код был написан мной на VC++ 2008 - все прекрасно компилируется и работает.
... а вот GNU C++ ругается

Большое спасибо.

. . . . . 
детали реализации операторов (если нужно приведу еще):

Код

//assign text of char* to mystring object
mystring mystring::operator = (char *text){

    errCode=NOERR_XSTRE;

    this->setText(text);
    return(*this);
}


//assign one mystring object to another one
xstring xstring::operator = (xstring &xstr){
    
    errCode=NOERR_XSTRE;
    
    this->set(&xstr);
    return(*this);
}



// add text of char* to mystring object
mystring mystring::operator + (char *text){
    errCode=NOERR_XSTRE;
    
    this->catText(text);
    return(*this);
}



PM MAIL   Вверх
zim22
Дата 28.9.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(sinoptic @  28.9.2009,  14:48 Найти цитируемый пост)
Следующий код не компилируется:

следующий код компилируется
Код

class mystring {
  public:
  mystring() { }
  mystring(const char*) { }

  mystring operator=(char *text);
  mystring operator+(char *text);

};

mystring mystring::operator= (char *text){
    return(*this);
}

mystring mystring::operator +(char *text){
    return(*this);
}

int main()
{
    mystring str1, str2("string2");
    str1="string1"; // это проходит нормально
    str1 = str2;    // это проходит нормально
    str1=str1+"12345";  //
}




--------------------
PM MAIL   Вверх
sinoptic
Дата 29.9.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.9.2009

Репутация: нет
Всего: нет



Да компилируется, вы правы и должно компилироваться. 
Причину на что ругается GCC я нашел.

Проблемы начинаются когда добавляете в объявление класса:

Код

mystring operator = (mystring &)

Да, ошибка вылазит в другом месте.
... тут я, признаться, начудил - достаточно просто:

Код

mystring operator = (mystring )



Одно в этой ситуации забавляет - MS VC++ это съел и был доволен. smile


Это сообщение отредактировал(а) sinoptic - 29.9.2009, 10:49
PM MAIL   Вверх
bsa
Дата 29.9.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



sinoptic, создай эти операторы:
Код
mystring::mystring(); //конструктор по умолчанию
mystring::mystring(const mystring &); //конструктор копирования
mystring::mystring(const char *); //конструктор из Си-строки
mystring::~mystring(); //деструктор
void mystring::swap(mystring &); //обмен одной строки с другой

mystring& mystring::operator+=(const mystring&);
mystring& mystring::operator=(const mystring &s) { //оператор копирования
   mystring(s).swap(*this);
   return *this;
}
mystring operator+(const mystring &s1, const mystring &s2)
{
   return mystring(s1) += s2;
}
и у тебя будет работать выражение x = y + z, где y типа mystring, а z или mystring, или const char*; или наоборот (но один из первых двух суммируемых должен быть обязательно mystring).

Цитата(sinoptic @  29.9.2009,  10:47 Найти цитируемый пост)
Одно в этой ситуации забавляет - MS VC++ это съел и был доволен. 

Потому что он менее соответствует стандарту, чем GCC

Это сообщение отредактировал(а) bsa - 29.9.2009, 12:12
PM   Вверх
sinoptic
Дата 29.9.2009, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.9.2009

Репутация: нет
Всего: нет



С этим я конечно разобрался: по самому первому случаю - обязательно 'const' в описании аргументов функции надо было ставить. 
То то ошибка и выползала: " ...no match for 'operator=' ..."

По вашему описанию (и собственно говоря по описанию классических и умных книг) я попытался реализовать оператор  + с двумя аргументами
К сожалению GCC и здесь меня одернул.

На классический пример:

Код

.....
mystring operator + (const mystring&, const mystring&); //<-- error
.....
.....
mystring mystring::operator+(const mystring &str1, const mystring &str2){ //<-- error
    return(*this);
}


в обоих местах: и объявлении метода в классе и в реализации этого метода - появляется ошибка:

error: 'mystring mystring::operator+(const mystring&, const mystring&)' must take either zero or one argument

Это меня честно говоря в тупик ставит - почему только один аргумент дозволен?!


Попытался я обойтись одним аргументом.
К сожалению один аргумент не работет в следующем случае:

Код


mystring str1("st1"), str2("st2");

str1=str1+str2;



При дебаге видно что ход программы заходит в оператор + и все там исполняется корректно, складываюся обе строки, на этом все... 
Оператор = уже не исполняется, а str1 в окнце концов остается пустым, ни "st1" ни "st2" - как будто только что конструктор исполнился.

Такие вот дела, кто то может что-то посоветовать?

PM MAIL   Вверх
zim22
Дата 29.9.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(sinoptic @  29.9.2009,  20:13 Найти цитируемый пост)
Такие вот дела, кто то может что-то посоветовать?


приведи минимальный, законченный кусок кода, иллюстрирующий проблему. чтобы я мог скопировать этот код, нажать кнопочку Build и посмотреть на ошибки.
Цитата(sinoptic @  29.9.2009,  20:13 Найти цитируемый пост)
mystring operator + (const mystring&, const mystring&); //<-- error

у меня ошибки нет.


Это сообщение отредактировал(а) zim22 - 29.9.2009, 20:49


--------------------
PM MAIL   Вверх
bsa
Дата 29.9.2009, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



sinoptic, в своем примере я специально указал, какие функции ДОЛЖНЫ быть методами (mystring::), а какие НЕТ. А ты все пытался сделать методами.

Это сообщение отредактировал(а) bsa - 29.9.2009, 20:54
PM   Вверх
sinoptic
Дата 30.9.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.9.2009

Репутация: нет
Всего: нет




Да, теперь заметил. Оператор с двумя аргументами нужно определять вне класса. 

Все компилируется и работает теперь!   smile 

Огромное СПАСИБО!  
Теперь у меня в голове все встало на место.


PM MAIL   Вверх
zim22
Дата 30.9.2009, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(sinoptic @  30.9.2009,  11:33 Найти цитируемый пост)
Оператор с двумя аргументами нужно определять вне класса. 

можно и внутри класса определить


--------------------
PM MAIL   Вверх
andrew_121
Дата 30.9.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(zim22 @  30.9.2009,  11:57 Найти цитируемый пост)
можно и внутри класса определить 

Не провоцируй человека на новые вопросы smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 30.9.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(zim22 @  30.9.2009,  11:57 Найти цитируемый пост)
можно и внутри класса определить 
Нельзя. Или с одним аргументом, или вне класса. Вариант с методом класса не будет работать в случае str1 = "asb" + str2, а в случае внешней функции будет, догадайся почему?  smile 

PM   Вверх
zim22
Дата 30.9.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



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

Это сообщение отредактировал(а) zim22 - 30.9.2009, 14:07


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1000 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.