1

Тема: Помилка String::String(void): member function already defined

#include <iostream>
using namespace std;
class String {
public:
    static int amount;
    char *string;
    char *string2;
    char *string3;
    int size;
    String() {
        string = new char[81];
    }
    String() : string2(nullptr), string3(nullptr), size(80) { }
    String(int size_, char* string3_) :size(size_), string3(string3_) { }
    ~String() {
        delete[] string;
        delete[] string2;
        delete[] string3;
    }
    void input() {
        cout << "Enter the 1 string: ";
        fgets(string, 80, stdin); 
        cout << "\nEnter the 2 string: ";
        fgets(string2, size, stdin);
        cout << "\nEnter the 3 string: ";
        fgets(string, size, stdin);
        amount++;
    }
    void print() { cout << amount << "\nstring1: " << string << "\nstring2: " << string2 << "string3: " << string3 << "\n"; }
};
int String::amount = 0;
int main() {
    String s;
    s.input();
    s.print();
}

Код не працює так як потрібно, я можу записати тільки перший рядок два наступних він пропуска і вибиває помилку.
ось завдання Завдання: Розробити клас String, який в подальшому будемо використовувати для роботи з рядками. Клас повинен містити:

  • Конструктор за замовчуванням, що дозволяє створити рядок довжиною 80 символів;

  • Конструктор, що дозволяє створювати рядок довільного розміру;

  • Конструктор, який створює рядок і ініціалізує його рядком, отриманим від користувача.

Необхідно створити деструктор. Клас повинен містити методи для введення рядків з клавіатури і виведення рядків на екран. Також потрібно реалізувати статичну функцію-член, яка буде повертати кількість створених об’єктів рядків.

Від модератора: тему перенесено у відповідний розділ.

2

Re: Помилка String::String(void): member function already defined

Будь ласка вкпжіть виш, де навчають такй *ні

3

Re: Помилка String::String(void): member function already defined

У мене цей код узагалі не компілюється.
Напишіть, яку саме помилку у вас виводить.

4

Re: Помилка String::String(void): member function already defined

перекидає в розділ xstring та виводить ось це: Exception thrown at 0x00007FFBE65C7A41 (ucrtbased.dll) in ConsoleApplication15.exe: 0xC0000005: Access violation reading location 0x0000000000000000.

5

Re: Помилка String::String(void): member function already defined

Не знаю, чого в xstring кидає (ви ж, сподіваюся, не використовуєте одночасно ваші стрічки і std::string?), але Access violation reading location 0x0000000000000000 - ніби очевидно: ви десь намагаєтеся читати за адресою nullptr (0x0000000000000000 - це саме nullptr).
Утім, я не можу сказати, де, бо, ще раз, у мене цей код узагалі не компілюється. Мабуть, ви його десь виправили, але чомусь не хочете нам цього казати.

Подякували: leofun011

6

Re: Помилка String::String(void): member function already defined

пище ще помилку типу String::String(void): member function already defined or declared,
я трохи змінила код

#include <iostream>
using namespace std;
class String {
public:
    static int amount;
    char string;
    int size;
    String() : string(80) {}
    String() {
        int size = 0;
        char *string = new char[size + 1];
    }
    String(char *stringus) {
        string = *stringus;
    }
    ~String() {
        delete[] &string;
    }
    void input() {
        cout << "Enter the 1 string: ";
        fgets(&string, 80, stdin);
        amount++;
    }
    void print() { cout << amount << "\nstring1: " << string; }
};
int String::amount = 0;
int main() {
    String s;
    s.input();
    s.print();
}

7

Re: Помилка String::String(void): member function already defined

в мене все працює
https://i.ibb.co/k8PVvd1/1j-Vs7yl-Imgur.png
тож

обирай знаряддя

https://24.lv/images/thumbnails/1143/800/detailed/777/4050401-0509-0.jpg
https://stm.dn.ua/wp-content/uploads/2022/11/f8917514-6868-11ec-94a3-00259038ef0a-1.jpeg

8

Re: Помилка String::String(void): member function already defined

lissakorn написав:

пище ще помилку типу String::String(void): member function already defined or declared,

І що тут незрозумілого? Конструктор String::String визначено двічі, тому коли компілятор дістається до другого визначення, то пише, що вже є таке визначення.

lissakorn написав:
    String() : string(80) {}
    String() {
        int size = 0;
        char *string = new char[size + 1];
    }

Як саме ви очікуєте, щоб це працювало? В одному випадку ви char *string ініціалізуєте числом 80 (а решту змінних лишаєте не ініціалізованими), в іншому задаєте значення size (0) і string, але не задаєте string2 і string3. А викликана буде лише одна з двох функцій.

Подякували: leofun011

9

Re: Помилка String::String(void): member function already defined

koala написав:

А викликана буде лише одна з двох функцій.

Гм, це неочікувана поведінка від компілятора. Це звичайна редекларація функції-члена і має бути діагностована.

http://eel.is/c++draft/class.mem#general-5 написав:

A member shall not be declared twice in the member-specification, except that

  • a nested class or member class template can be declared and then later defined, and

  • an enumeration can be introduced with an opaque-enum-declaration and later redeclared with an enum-specifier.

Тут не може бути ситуації, де лінкер би вибирав між двома inline функціями.

P.S. - lissakorn на форумі існує окремий розділ для питань пов'язаних з C++. Будь ласка, наступного разу створюйте ваші теми у відповідному розділі.

Подякували: leofun011

10 Востаннє редагувалося koala (02.10.2023 15:33:23)

Re: Помилка String::String(void): member function already defined

wander написав:

Тут не може бути ситуації, де лінкер би вибирав між двома inline функціями.

Я гадаю, lissakorn спершу написала код з однією функцією, а потім, коли він не спрацював, додала другу. От яку саме - я сказати не можу. Я мав на увазі, що якщо lissakorn очікує, що будуть викликані обидва конструктори й проініцалізують усі члени - то ні, такого не станеться.

Подякували: wander, leofun012