Не могу разобраться с перегрузкой оператора + (конкатенация строк)

Как сделать так, чтобы строка Microsoft и Windows сложились и получилась строка MicrosoftWindows, у меня почему-то выводит только слово Microsoft.

#include <iostream>
#include <cstring> // C style string
#include "String.h"
using namespace std;

String::String(const char* other)
{
    size = strlen(other) + 1;
    str = new char[size];
    strcpy_s(str, size, other);//
}

String::String(const String& other):String(other.str)
{
//cout << ">>>>>>> COPY ctor string " << this << " >>>>>>>" << endl;
    for (int i = 0; i < size; i++)
        str[i] = other.str[i];
}

String::String(int size, const char* str):size(size), str(new char [size] {})
{
//cout << ">>>>>>> Ctor with 1 param " << size << " string " << this << " >>>>>>>\n";
}

String::String(int b, int size)
{
    str = new char[b];
}

String::String(char* other, int n, char* str)
{
    str = new char[n];
    strcpy_s(other, size, str);
}

void String::input()
{
    cout << "Enter string: " << endl;
    cin.getline(str, size);
}

String String::concat(const String& obj)//конкатенація рядків
{
    string str1 = "Programm ";
    string str2 = "C++";
    cout << str1 + str2 << endl;
    return String();
}

char* String::intersect(const char* a, const char* b)
{
    char* s = _strdup(a);
    char* p = s;
    for (; *a; ++a)
    {
        if (strchr(b, *a))
        *p++ = *a;
    }
    *p = '\0';
    return s;
}

String String::operator+(const String& s)
{
    String new_string;
    new_string.size = this->size + s.size;
    new_string.str = new char[this->size + s.size + 1];
    for (int i = 0; i < this->size; i++)
        new_string.str[i] = this->str[i];
    for (int i = 0; i < s.size; i++)
        new_string.str[this->size + i] = s.str[i];
    return new_string;
}

String String::operator*(const String& s)
{
    return String();
}

String::~String()//деструктор;
{
    //cout << ">>>>>>> Dtor done for String " << size << " >>>>>>>\n";
    if (str != nullptr)
    {
        delete[] str;
        str = nullptr;
        size = 0;
    }
}

String.h:
#pragma once
#include <iostream>

class String
{
public:
    String(const char* other);
    String (const String& other);
    String(int size = 80, const char* str = "");
    String(int b, int size);
    String(char* other, int n, char* str);
    void input();
    String concat(const String& obj);
    char* intersect(const char* a, const char* b);
    const char* getString() const;
    String operator+(const String& s);
    String operator*(const String& s);
    ~String();
private:
    char* str;
    int size;
};
inline const char* String::getString() const
{
    return str;
}

Ответы (1 шт):

Автор решения: Maxim

В операторе + записывался нулевой символ от первой строки, это приводило к тому, что выводилась только она, так как вывод строки прекращается при достижении нуля

#include <iostream>
#include <cstring>
using namespace std;

class String
{
public:
    String(const char* other);
    String (const String& other);
    String(int size = 80, const char* str = "");
    String(int b, int size);
    String(char* other, int n, char* str);
    void input();
    String concat(const String& obj);
    char* intersect(const char* a, const char* b);
    const char* getString() const;
    String operator+(const String& s);
    String operator*(const String& s);
    operator char*();
    ~String();
private:
    char* str;
    int size;
};

inline const char* String::getString() const
{
    return str;
}

String::String(const char* other)
{
    size = strlen(other) + 1;
    str = new char[size];
    strcpy(str, other);
}

String::String(const String& other):String(other.str)
{
//cout << ">>>>>>> COPY ctor string " << this << " >>>>>>>" << endl;
    for (int i = 0; i < size; i++)
        str[i] = other.str[i];
}

String::String(int size, const char* str):size(size), str(new char [size] {})
{
//cout << ">>>>>>> Ctor with 1 param " << size << " string " << this << " >>>>>>>\n";
}

String::String(int b, int size)
{
    str = new char[b];
}

String::String(char* other, int n, char* str)
{
    str = new char[n];
    strcpy(other, str);
}

void String::input()
{
    cout << "Enter string: " << endl;
    cin.getline(str, size);
}

String String::concat(const String& obj)//конкатенація рядків
{
    string str1 = "Programm ";
    string str2 = "C++";
    cout << str1 + str2 << endl;
    return String();
}

char* String::intersect(const char* a, const char* b)
{
    char* s = strdup(a);
    char* p = s;
    for (; *a; ++a)
    {
        if (strchr(b, *a))
        *p++ = *a;
    }
    *p = '\0';
    return s;
}

String String::operator+(const String& s)
{
    String new_string;
    new_string.size = size + s.size - 1;
    new_string.str = new char[new_string.size];
    strcpy(new_string.str, str);
    strcat(new_string.str, s.str);
    return new_string;
}

String String::operator*(const String& s)
{
    return String();
}

String::operator char*() {
    return str;
}

String::~String()//деструктор;
{
    //cout << ">>>>>>> Dtor done for String " << size << " >>>>>>>\n";
    if (str != nullptr)
    {
        delete[] str;
        str = nullptr;
        size = 0;
    }
}

int main()
{
    String s1 = "Microsoft";
    String s2 = "Windows";
    String s3 = s1 + s2;
    cout<<s3;

    return 0;
}

Ссылка на код

→ Ссылка