Перегрузка оператора присваивания C++ без использования strcpy

130
05 сентября 2019, 04:50

Изучаю C++. Буду очень признателен за любую помощь. Не нашел ответа на сайте. Нужно переопределить оператор присваивания. Сейчас сделано так:

    Stroka& Stroka::operator=(const Stroka& s)
{
    strcpy(str, s.str);
    return *this;
}

Но нужно, чтобы он работал с использованием конструкции вида - без использования strcpy:

void Stroka::kopir(char *first, char *second)
{
    while (*second) {
        *first++ = *second++;
    }
    *first = '\0'; // символ перевода строки, = \n
}

Полный код программы взят из учебного примера, выглядит следующим образом:

#include "pch.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <string.h>
using namespace std;
class Stroka {
    char str[80];
public:
    // Конструктор класса 
    Stroka(char*);
    Stroka(const char*);
    // Конструктор класса 
    Stroka() {}
    Stroka(const Stroka&); // Конструктор копирования
    Stroka& operator=(const Stroka&); // переопределение/перегрузка операции присваивания
    Stroka& operator+(const Stroka&); // переопределение операции сложения
    int operator==(const Stroka&); // переопределение операции сравнения
    void vvod();
    void vyvod();
    void kopir(char *first, char *second);
}
;
Stroka::Stroka(char *string)
{
    strcpy(str, string);
}
Stroka::Stroka(const Stroka& s)
{
    strcpy(str, s.str);
}
Stroka& Stroka::operator+(const Stroka& s)
{
    strcat(str, s.str);
    return *this;
}
// метод класса Stroka
int Stroka::operator==(const Stroka& s)
{
    if ((strcmp(str, s.str)) == 0)
        return 1;
    else
        return 0;
}
void Stroka::vvod()
{
    cout << "Введите текст:" << endl;
    cin >> str;
}
void Stroka::vyvod()
{
    cout << "Вывод текста на экран:" << endl;
    cout << str << endl;
}
Stroka& Stroka::operator=(const Stroka& s)
{
    strcpy(str, s.str);
    return *this;
}
void Stroka::kopir(char *first, char *second)
{
    while (*second) {
        *first++ = *second++;
    }
    *first = '\0'; // символ перевода строки, = \n
}
int main(int)
{
    setlocale(0, ""); // установить русскую локацию
    Stroka s1;
    s1.vvod();
    Stroka s3;
    s3.vvod();
    Stroka s4;
    s4 = s1;
    Stroka s5;
    s3.vyvod();
    s5 = s1 + s3 + s4;
    s5.vyvod();
    if (s1 == s5)
        cout << "строки s1 и s5 равны";
    else
        if (s1 == s4)
            cout << "строки s1 и s4 равны";
}
;
Answer 1

Можно вот так:

Stroka& Stroka::operator=(const Stroka& s)
{
    this->kopir(str, s.str);
    return *this;
}
READ ALSO
В каком порядке вызываются слоты?

В каком порядке вызываются слоты?

Если к одному сигналу подключены множество слотов, то в каком порядке оны вызываются?

126
Как с помощью QT вывести на монитор 10-битное изображение?

Как с помощью QT вывести на монитор 10-битное изображение?

Недавно появился снэпшот Qt 513, в котором у QImage стал доступен формат QImage::Format_Grayscale16

116
Задача перебора значений

Задача перебора значений

Попалась следующая задачаИмеется входное значение частоты Fin и выходное Fout

98
connect с указателями в контейнере

connect с указателями в контейнере

При соединении с указателями, которые находятся внутри локального map, вылетает программа с ошибкой: Segmentation faultЕсли сделаю мап статик или как...

127