Не могу разобраться с перегрузкой оператора + (конкатенация строк)
Как сделать так, чтобы строка 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;
}