Не могу сделать перегрузку C++

282
22 октября 2017, 22:21
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
char* StrCat(char* str1, char* str2);
class String
{
public:
    String(int);
    String(const String&);
    void showArray();
    void operator +(char *s) //что должен выполнить оператор +
    {
        StrCat(*str, s); //сложение строк
    }
    char* &operator[](int j);
    ~String();
private:
    char **str;
    int sizeOfArray;
};
String::String(int size)
{
    sizeOfArray = size;
    str = new char *[sizeOfArray];
    for (int i = 0; i < sizeOfArray; i++)
    {
        str[i] = new char[2048];
    }
}
String::String(const String& obj)
{
    sizeOfArray = obj.sizeOfArray;
    str = new char *[sizeOfArray];
    for (int i = 0; i < sizeOfArray; i++)
    {
        str[i] = new char[2048];
        str[i] = obj.str[i];
    }
}
char* &String::operator[](int j)
{
    if (sizeOfArray <= j)
    {
        exit(1);
    }
    return str[j];
}
void String::showArray()
{
    for (int i = 0; i < sizeOfArray; i++)
    {
        cout << str[i] << " | ";
    }
    cout << endl << endl;
}
String::~String()
{
    delete str;
}
int StrLen(char* _str)
{
    int size = 0;
    for (; _str[size] != 0; size++);
    return size;
}
void StrCpy(char* in_str, char* src_str)
{
    for (int i = 0; i < StrLen(in_str); i++)
        in_str[i] = src_str[i];
}
char* StrCat(char* str1, char* str2)
{
    int sz = StrLen(str1) + StrLen(str2);
    char* ts = new char[sz + 1];
    for (int i = 0; i < StrLen(str1); i++)
        ts[i] = str1[i];
    for (int ii = StrLen(str1), j = 0; ii <= sz; ii++, j++)
        ts[ii] = str2[j];
    delete str1;
    str1 = ts;
    return str1;
}
int main()
{
    String a(3);
    String b(6);
    a[0] = "1";
    a[1] = "2";
    a[2] = "3";
    a[0] + a[1];
    cout << a[0];
    system("pause");
}

Не понимаю ошибку(((, надо сделать a[0] + a[2] - например, и чтобы в a[0] добавилась строка a[2];

Answer 1

Ваша StrCat(char* str1, char* str2) сначала принимает указатели по значению, а затем делает с ними это:

str1 = ts;

«По значению» означает, что str1 — это всего лишь копия того *str, который вы передали функции при вызове. Вам же нужна передача по ссылке. Измените объявление функции на:

 void StrCat(char*& str1, char* str2)

Только после этого любая модификация str1 будет отражаться на *str.

P. S.: По хорошему, бинарные операторы (включая +) не должны трогать свои параметры, а возвращать вместо этого новое значение. Вам по смыслу нужен модифицирующий оператор +=:

a[0] += a[1];

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

class String
{
public:
    void operator +=(const char *s)
    {
        StrCat(*str, s);
        return *this;
    }
    // ...
};

Обратите внимание, что я защитил данные по указателю s от случайного изменения, сделав этот указатель константным.

READ ALSO
Как &ldquo;найти&rdquo; boost.program_options?

Как “найти” boost.program_options?

В своем проекте на C++ применяю boostprogram_options

217
Разделение string на элементы массива через нужный символ

Разделение string на элементы массива через нужный символ

Подскажите, а способа как использовать <vector> для разделения нужной мне строки на подстроки, которые будут заноситься в массив, нет?

262
C++ - Неверный результат работы программы [требует правки]

C++ - Неверный результат работы программы [требует правки]

Решение задачи проходит только на 67,20 из 100И я совершенно не могу понять в чем проблема, перепробовал все что знаю, иногда выдает неправильный...

417
Простое слияние сортировка

Простое слияние сортировка

Не могу понять где теряет элементы файла после сортировки

271