Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 1
Регистрация: 06.10.2014
Сообщений: 80

Дружественная функция, аналог strcmp

16.12.2015, 16:29. Показов 3947. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс Stroka, с двумя полями: str - сама строка и maxlen - длина строки(без учета нуль символа).
Вот объявление:
C++
1
2
3
4
5
class Stroka {
private:
    char *str;
    int maxlen;
............};
Нужно написать дружественную функцию для сравнения двух строк, не используя стандартную strcmp().
И самое главное, это то как передать параметры в функцию, что-бы компилятор брал поле только поле str от одного и от другого элемента класса. Просто не понимаю как это сделать, помогите пожалуйста.

[/CPP]
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2015, 16:29
Ответы с готовыми решениями:

Аналог strcmp только для слов
Я знаю,что strcmp сравнивает две строки,а есть ли такая команда ,чтобы сравнивала два слова в одной строке(одномерный массив)? Мне нужно...

Дружественная функция
описать классы автомобиль и маршрут. Использовать дружественную функцию определить количество потраченного топлива и время на преодоление...

Дружественная функция
У меня есть класс, подсчитывающий количество равносторонних треугольников в заданном множестве точек на плоскости. Подскажите,...

8
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
16.12.2015, 16:59
Цитата Сообщение от Microthel Посмотреть сообщение
И самое главное, это то как передать параметры в функцию,
В параметрах - два объекта Stroka.

Добавлено через 5 минут
Начало:
C++
1
2
3
4
5
6
friend bool cmpStroka(Stroka obj1, Stroka obj2)
    {
        if (obj1.maxlen != obj2.maxlen)
           return false;
        //...
    }
Добавлено через 2 минуты
Надеюсь, конструктор копирования, оператор присваивания и деструктор имеются?

Добавлено через 2 минуты
Чтобы избежать копирования, можно так:
C++
1
2
3
4
5
6
friend bool f(const Stroka& obj1, const Stroka& obj2)
    {
        if (obj1.maxlen != obj2.maxlen)
           return false;
        //...
    }
0
0 / 0 / 1
Регистрация: 06.10.2014
Сообщений: 80
16.12.2015, 18:09  [ТС]
Цитата Сообщение от nord_v Посмотреть сообщение
Надеюсь, конструктор копирования, оператор присваивания и деструктор имеются?
Конструктор и деструктор:
C++
1
2
3
4
5
6
7
8
9
10
  Stroka(){
        str = new char[255];
        strcpy(str, "");
        maxlen = strlen(str);
    }
 
    ~Stroka(){
        delete []str;
        cout << "\n\n!!!Деструктор!!!\n\n";
    }
Вот так выполняется ввод строки:
C++
1
2
3
4
5
6
7
 void InputR() {
        char q[255];
        cout << "\n\nВедите строку:\n";
        scanf("%255[^\n]", q);
        strcpy(str, q);
        maxlen = strlen(q);
    }
Аналогичная ф-я к strcmp:
C++
1
2
3
4
5
6
7
8
9
10
    int StrCompare(const char *first, const char *second)
    {
        int result;
        while(true)
        {
            if ((result = *first - *second++) != 0 || !*first++) break;
        }
        if(!result) return 0;
        else return (result > 0) ? (1) : (-1);
    }
Если взять за основу функцию сверху, то как реализовать ее для данного класса как дружественную?

Добавлено через 5 минут
Цитата Сообщение от nord_v Посмотреть сообщение
В параметрах - два объекта Stroka.
Напоминаю, поля закрыты! Нужно что-бы при вызове в ф-ыи main(): StrCompare(a, b), где a и b это объекты класса Stroka, выдавало один из трех результатов.
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
16.12.2015, 18:14
Цитата Сообщение от Microthel Посмотреть сообщение
Конструктор и деструктор:
Цитата Сообщение от nord_v Посмотреть сообщение
Надеюсь, конструктор копирования, оператор присваивания
???
Цитата Сообщение от Microthel Посмотреть сообщение
Если взять за основу функцию сверху, то как реализовать ее для данного класса как дружественную?
StrCompare()? Начало я показал.

Добавлено через 3 минуты
Цитата Сообщение от Microthel Посмотреть сообщение
Напоминаю, поля закрыты!
Дружественная функция чем от обычной отличается?
0
0 / 0 / 1
Регистрация: 06.10.2014
Сообщений: 80
16.12.2015, 18:23  [ТС]
Еще тут такая штука, что в функции что я кинул выше используются указатели, и писать так как указали Вы нельзя.
Вот так я пробовал писать:
(объявление в классе)
C++
1
friend int StrCmp(const Stroka& obj1, const Stroka& obj2);
(объявление вне класса)
C++
1
2
3
4
5
6
7
8
int StrCmp(const Stroka& obj1, const Stroka& obj2){
        int result;
        while(true){
            if ((result = *obj1 - *obj2++) !=0 || !*obj1++) break;
        }
        if (!result) return 0;
       else return (result > 0) ? (1) : (-1);
    }
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
16.12.2015, 18:27
Цитата Сообщение от nord_v Посмотреть сообщение
friend bool f(const Stroka& obj1, const Stroka& obj2)
* * {
* * * * if (obj1.maxlen != obj2.maxlen)
* * * * * *return false;
* * * * //...
* * }
Тут, через объект, получается доступ к полю maxlen, так же можно получить доступ и к указателям str объектов obj1 и obj2. Думай.
0
0 / 0 / 1
Регистрация: 06.10.2014
Сообщений: 80
16.12.2015, 18:32  [ТС]
Теперь понял) Но при написании:
C++
1
2
3
4
5
6
7
8
int StrCmp(const Stroka& obj1, const Stroka& obj2){
        int result;
        while(true){
            if ((result = obj1.str - obj2.str++) !=0 || !obj1.str++) break;
        }
        if (!result) return 0;
       else return (result > 0) ? (1) : (-1);
    }
Выдает следующее:
error: increment of member 'Stroka::str' in read-only object
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
16.12.2015, 18:40
Лучший ответ Сообщение было отмечено Microthel как решение

Решение

Объекты const потому что, а ты значение указателя меняешь.

Добавлено через 2 минуты
Сделай перемещение по указателям через индекс.
1
0 / 0 / 1
Регистрация: 06.10.2014
Сообщений: 80
16.12.2015, 18:49  [ТС]
Огромное спасибо! Все работает)
Рабочая функция:
C++
1
2
3
4
5
6
7
8
9
int StrCmp(const Ryadok& obj1, const Ryadok& obj2){
        int result, i = 0;
        while(true){
            if ((result = obj1.str[i] - obj2.str[i]) !=0 || !obj1.str[i]) break;
            i++;
        }
        if (!result) return 0;
       else return (result > 0) ? (1) : (-1);
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2015, 18:49
Помогаю со студенческими работами здесь

Дружественная функция c++
Никак не пойму, как заставить void M заработать, хелп. Не видит переменные. #include &lt;string&gt; #include &lt;stdio.h&gt; ...

Дружественная функция
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; class massiv { int len,*p_mas; public : massiv() {} massiv...

Дружественная функция
Хочу сделать вычисление площади как дружественную функцию, начал описывать, дальше догнать не могу как кодить. Подскажите? #include...

Дружественная функция
Здравствуйте. Написал программу, которая должна матрицу умножать на число, но я не понимаю как вызвать дружественную функцию... Помогите...

Дружественная функция-член
Проблема казалась тривиальной, но решить не получилось. Допустим есть два класса: class Screen; class Window_mgr { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru