Ошибка (активно) E0330 "String_indent::String_indent(const char *string)" (объявлено в строке 102)

Не понимаю почему экземпляр класса не хочет принимать мою строку, хотя сделано вроде как все верно:

String_indent::String_indent(const char* string) {

    int len = strlen(string);
    this->string = new char(len + 1);

    for (int i = 0; i < len; i++) {
        this->string[i] = string[i];
    }
    this->string[len + 1] = '\0';
}
String_indent::~String_indent() {
    delete[]  this->string;
}

Класс String_indent наследован от класса String, в котором точно такая же реализация и она работает

class String_indent : public String{
String_indent();
    String_indent(const char* string);
    void Upper_case();
    void Lower_case();

    ~String_indent();

private:
    char* string;
    int len;
}
int main() {
    String string("String"); // Работает
    String_indent string1("String"); // Не работает
    return 0;
}

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

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

Короткое замечание — непонятно, зачем вам вообще функция get_len?

Ну, а по делу... Вот ваш код, обратите внимание на строки, помеченные //// — это внесенные исправления (на ваши функции-члены я не смотрел, только на само наследование и конструкторы-деструкторы). Постарайтесь разобраться, почему такие изменения. Главное — если вы наследуете другой класс, то не надо его дублировать!

class String {
public:
    String();
    String(const char* string);
    void printString();
    void get_len(const char* string);
    ~String();
protected:                               ////
    char* string;
    int len;
};
class String_indent : public String {    ////
public:                                  ////
    String_indent();
    String_indent(const char* string);
    void Upper_case();
    void Lower_case();
    ~String_indent();
//private:                               ////
//    char* string;                      ////
//    int len;                           ////
};
int main()
{
    String string("String");
    String_indent string1("String");
    return 0;
}
/*Конструктор без параметра класса String для задания начальных данных переменным string*/
String::String()
{
    string = nullptr;
}
/*Конструктор с параметром который содержит указатель на массив чаров string и определяет основную реализацию строки*/
String::String(const char* string)

{
    len = strlen(string);                ////
    this->string = new char[len + 1];    ////
    for (int i = 0; i < len; i++) {
        this->string[i] = string[i];
    }
    this->string[len] = '\0';            ////
}
void String::printString()
{
    cout << string;
}
void String::get_len(const char* s)
{
    int l = strlen(s);
    cout << l;
}
/*Деструктор класса очищает память*/
String::~String()
{
    delete[] this->string;
}
void String_indent::Upper_case()
{
    for (int i = 0; i < len; i++) {
        if ((this->string[i] >= 141) && (this->string[i] <= 172)) {
            this->string[i] = string[i] - 40;
        }
        else if ((this->string[i] >= 101) && (this->string[i] <= 132)) {
            this->string[i] = string[i];
        }
        else cout << "NULL";
        cout << string[i];
    }
}

void String_indent::Lower_case()
{
}
String_indent::String_indent() {
    string = nullptr;
}
String_indent::String_indent(const char* string)  ////
:String(string)                                   ////
{                                                 ////
//  int len = strlen(string);                     ////
//  this->string = new char(len + 1);             ////
//  for (int i = 0; i < len; i++) {               ////
//      this->string[i] = string[i];              ////
//  }                                             ////
//  this->string[len + 1] = '\0';                 ////
}                                                 ////

String_indent::~String_indent()
{
//    delete[] this->string;                      ////
}
→ Ссылка