Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 18.01.2016
Сообщений: 195

Запрет на перегрузку функций с типом char

25.05.2018, 10:56. Показов 1219. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В задаче нужно создать два конструктора позволяющих создать строку разной длины.
Но при создании этих конструкторов компилятор ругается: error: 'String::String(char*)' cannot be overloaded

Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
class String{
    char str1[80];
    char str2[];
    public:
        String(char str[]) {
            strcpy(this->str1, str);
        }
        String(char str[]) {
            strcpy(this->str2, str);
        }       
};
 
int main() {
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.05.2018, 10:56
Ответы с готовыми решениями:

Преобразовать массив с типом char в массив с типом int
Что-то не получается у меня найти инфу именно с преобразованием массивов с char в int. Нахожу только преобразование с числами. ...

перегрузку функций
Задание: Используя перегрузку функций, написать программу определения максимального значения элемента массива разного типа. На...

Разработать перегрузку функций
Добрый вечер! Вот задание: Разработайте перегрузки функций, в которые передаются массивы типов int, char, float, что возвращают количество...

18
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.05.2018, 11:01
У вас дважды объявлен конструктор, принимающий char*.
Компилятор не разрешает создать оба варианта т.к. не будет понятно какой из них использовать.
0
1 / 1 / 0
Регистрация: 18.01.2016
Сообщений: 195
25.05.2018, 11:26  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
У вас дважды объявлен конструктор, принимающий char*.
Компилятор не разрешает создать оба варианта т.к. не будет понятно какой из них использовать.
А как тогда можно правильно перегрузить конструкторы, чтобы можно было выполнить условие задачи?
0
Модератор
Эксперт С++
 Аватар для zss
13778 / 10971 / 6491
Регистрация: 18.12.2011
Сообщений: 29,257
25.05.2018, 11:43
C++
1
2
3
4
5
6
7
8
class String{
    char str1[80];
    char str2[80];
    public:
        String(char *stra="",char* strb="") {
            strcpy(str1, stra);
            strcpy(str2, strb);
        }
Но такой подход не соответствует логике - класс Строка, а внутри их две.
Зачем?
0
1 / 1 / 0
Регистрация: 18.01.2016
Сообщений: 195
25.05.2018, 20:23  [ТС]
Добавлено через 4 минуты
Цитата Сообщение от zss Посмотреть сообщение
Но такой подход не соответствует логике - класс Строка, а внутри их две.
Зачем?
Один позволяет создавать строку длиной 80 символов, другой строку произвольной длины.
Должно быть именно два конструктора. Это из задачника.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
25.05.2018, 21:24
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
using namespace std;
 
class String{
    char str1[80];
    const char* str2;
    public:
        String(char (&str)[80]) {
            for(int i = 0; i < 80; i++)
                str1[i] = str[i];
            str2 = nullptr;
        }
        String(const char* str) : str2(str) { }
        void show() {
            printf("%s\n", str2 == nullptr ? str1 : str2);
        }
};
 
int main()
{
    char a[] = "hello world";
    String A(a);
    String B("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"); // 90
    A.show();
    B.show();
    return 0;
}
Добавлено через 3 минуты
хотя как то не так работает)

Добавлено через 7 минут
а не всё правильно) когда длина строки меньше 80 символов вызывается один конструктор если больше другой)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.05.2018, 21:55
С-строке - да, да, да! std::string - нет, нет, нет!
Потому что строки char, это именины сердца. Можно любые создавать. Только лучше пусть конструктор решает задачу создания разных строк, а не задача разных строк создаёт разные конструкторы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;
 
template<int A>
struct CStrAAAshnaya
{
    CStrAAAshnaya(const char* str)
        :strahSize(A)
        {
            strahStr = new char[strahSize];
            for(int i=0; i<strahSize; ++i)strahStr[i]=str[i];
        }
    ~CStrAAAshnaya(){ delete []strahStr; }
 
        operator char*(){return strahStr;}
 
char* strahStr;
int strahSize;
};
 
int main(int argc, char* argv[])
{
    char * mama = "mama", * chernayaMamba = "chernayaMamba";
    CStrAAAshnaya<5> strashnayMama(mama);
    cout<<strashnayMama<<endl;
    CStrAAAshnaya<80> strashnayChernayaMamba(chernayaMamba);
    cout<<chernayaMamba<<endl;
    system("pause");
    return 0;
}
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
25.05.2018, 21:59
я всего лишь сделал что требовалось в задании))
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.05.2018, 22:03
Цитата Сообщение от IchimaruGin Посмотреть сообщение
я всего лишь сделал что требовалось в задании))
А я просто пошутил. Задание показалось странным.
Можно без кучи обойтись:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<int A>
struct CStrAshnayaStr
{
CStrAshnayaStr(const char* str)
        :strahSize(A)
        {
            
            for(int i=0; i<strahSize; ++i)strahStr[i]=str[i];
        }
 
        operator char*(){return strahStr;}
 
char strahStr[A];
int strahSize;
};
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
25.05.2018, 22:07
IGPIGP, я помнил про шаблоны просто давно ими не пользовался) не мог придумать как сделать) но про такую возможность знал)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.05.2018, 22:37
Цитата Сообщение от IchimaruGin Посмотреть сообщение
IGPIGP, я помнил про шаблоны просто давно ими не пользовался) не мог придумать как сделать) но про такую возможность знал)
IchimaruGin, я и правда пошутил. Если связываться с с-строками, то конструктор принимающий указатель и целое число - решает всё с избытком, а для чистых с-строк и одного указателя довольно. В противном случае возникает константа времени компиляции. У Вас это размер массива по ссылке, например. Я пошёл дальше и смастерил шаблон. Причём видно, что он логически плохо совместим с кучей, так как константа задаёт тип (инстанс) и лучше бы размер задать как константу. В этом смысле, Ваш вариант с массивом - то же самое. Встроенный примитивный массив это тоже шаблон (неявный). Законченный тип (инстанс) образуется при задании размера - константы времени компиляции.
Всё это мелочи по сравнению с вопросом, где можно использовать класс с парой таких конструкторов.
А шаблон с массивом - штука жесткая, но гораздо более быстрая и в создании и при удалении. То есть, логично или/или. Или создавать на стеке вовремя компиляции или в куче во время выполнения. Одновременно и то и другое (imho) бессмысленно.
0
1 / 1 / 0
Регистрация: 18.01.2016
Сообщений: 195
26.05.2018, 19:48  [ТС]
Цитата Сообщение от IchimaruGin Посмотреть сообщение
String(const char* str) : str2(str) { }
Просьба объяснить эту строку.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Всё это мелочи по сравнению с вопросом, где можно использовать класс с парой таких конструкторов.
Вот описание задачи:

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

- конструктор по умолчанию, позволяющий создать строку длиной 80 символов;
- конструктор, позволяющий создавать строку произвольного размера;
- конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя.

Класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
26.05.2018, 20:07
Igorby, в этом случае тоже самое что
C++
1
2
3
String(const char* str) {
    str2 = str;
}
Конструкторы, список инициализации вот там тоже немного есть на эту тему
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
26.05.2018, 21:11
Igorby, Так у тебя же написано, что конструктор по умолчанию задает строку из 80 символов, с параметром - произвольной длины, + копирования - тут чисто strcpy...
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.05.2018, 00:20
Цитата Сообщение от Igorby Посмотреть сообщение
Вот описание задачи:
Igorby, я понял задачу. Но она не прекратила казаться странной.
Цитата Сообщение от Igorby Посмотреть сообщение
конструктор, позволяющий создавать строку произвольного размера
позволяет создать строку и из 80 символов. О противоречивости задачи выделения ресурса известного во время компиляции размера совмещаемой с выделением ресурса размера времени выполнения я уже написал.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
27.05.2018, 00:27
IGPIGP, может это задача для поиска извращенцев в области программирования
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.05.2018, 09:15
Цитата Сообщение от IchimaruGin Посмотреть сообщение
IGPIGP, может это задача для поиска извращенцев в области программирования
Это во всех отношениях благородная и возвышенная задача. Однако, боюсь что цель иная. Я постоянно выжу задания, которые приучают делать "что сказано" и не думать о целесообразности. То есть, по большому счёту, - не думать.
Это странно, потому как придумать более-менее практически приемлемые задачи, сам бог велел.

Добавлено через 48 минут
Пара конструкторов запряженных зарею.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
using namespace std;
 
class String{
    char * m_str;
    int m_sz;
    public:
        String()
            :m_sz(80)
        {
            char * init = "ololo";
 
                m_str = new char[m_sz];
                char * init_ptr=init;
                int i;
                for(i=0; i<m_sz; ++i)
                {
                    if (!*init_ptr)init_ptr=init;
                    m_str[i]=*init_ptr++;
                
                }
           m_str[m_sz]=0;
        }
 
        String(const char *init)
        {
            m_sz = strlen(init);
            m_str = new char[m_sz];
                int i;
                for(i=0; i<=m_sz; ++i)
                {                   
                    m_str[i]=*init++;
                }
                m_str[m_sz]=0;
        }
~String(){delete [] m_str;}
 
        void show(){cout<<m_str<<endl;}
           
};
 
int main() {
String s;
s.show();
String sc("uuh");
sc.show();
cin.get(); 
}
один серый , другой - белый...
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
27.05.2018, 12:34
Цитата Сообщение от IGPIGP Посмотреть сообщение
String()
* * * * * * :m_sz(80)
* * * * {
* * * * * * char * init = "ololo";
m_str = new char[m_sz];
* * * * * * * * char * init_ptr=init;
* * * * * * * * int i;
* * * * * * * * for(i=0; i<m_sz; ++i)
* * * * * * * * {
* * * * * * * * * * if (!*init_ptr)init_ptr=init;
* * * * * * * * * * m_str[i]=*init_ptr++;
}
* * * * * *m_str[m_sz]=0;
* * * * }
зачем в цикл вставлять иф и зачем в конце выход за предел массива?)
Цитата Сообщение от IGPIGP Посмотреть сообщение
String(const char *init)
* * * * {
* * * * * * m_sz = strlen(init);
* * * * * * m_str = new char[m_sz];
* * * * * * * * int i;
* * * * * * * * for(i=0; i<=m_sz; ++i)
* * * * * * * * { * * * * * * * * *
* * * * * * * * * * m_str[i]=*init++;
* * * * * * * * }
* * * * * * * * m_str[m_sz]=0;
* * * * }
а здесь нужно память выделять на m_sz + 1 что бы можно было обращаться к m_sz элементу(хотя это ошибка двух этих примеров)

и что значит запряженных зарею?

П.С. я хз почему там звёздочки добавились)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.05.2018, 12:56
Цитата Сообщение от IchimaruGin Посмотреть сообщение
что значит запряженных зарею
Не знаю. В песне (романс) -"пара гнедых, запряжённых зарёю".

а лишний символ это терминатор. Арни говорил I'll be back и по началу это переводили как "я буду задницей". По смыслу иногда подходило, но потом оказалось - он таки прав: терминатор всегда именно с той стороны.

Добавлено через 10 минут
Цитата Сообщение от IchimaruGin Посмотреть сообщение
о память выделять на m_sz + 1
Да, - вконце наскоро правил и забыл. В new надо sz+1 передавать, - точно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.05.2018, 12:56
Помогаю со студенческими работами здесь

Не понимаю перегрузку функций
Привет. void f(int x) {} void f(const int&amp; x) {} int main() { f(5); } Почему компилятор не может понять, что нужно вызвать...

Задача на перегрузку функций
Разработать функцию, определяющую, является ли натуральное число квадратом какого-либо другого целого числа. Не использовать стандартную...

написать перегрузку функций
Помогите написать перегрузку функций на с++ #include &quot;stdafx.h&quot; #include&lt;iostream&gt; #include&lt;time.h&gt; #include&lt;stdlib.h&gt; ...

Строки с типом char * в С++
Помогите написать программу по строкам c++ При написании программ использовать нуль–терминированные строки и работать только с типом...

Работа с типом Char
Здравствуйте. У меня есть три переменные типа Char, размерность каждой переменной - 20 символов. Создал ещё одну переменную такого же типа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru