С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
#1

Перегрузка функций - C++

24.08.2011, 14:21. Просмотров 868. Ответов 11

Задача: создать объект формирующий HTML теги. Теги бывают двух типов - полные <p параметры_тега>Текст абзаца</p> и короткие <input параметры_тега />.
Хочу за счет создания разных подклассов тегов исключить ошибку вызова функции для полного тега с аргументами для короткого (и наоборот).

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
class cTag
{ private:
    class baseTag : public std::string
    { public:
        baseTag(const std::string &s) : std::string(s) {}
        baseTag(const char        *s) : std::string(s) {}
    };
  public:
    class FullTag  : public baseTag
    { public:
        FullTag(const std::string &s) : baseTag(s) {}
        FullTag(const char        *s) : baseTag(s) {}
    };
    static std::string Tag(const FullTag &T, const std::string &Param, const std::string &Body)
    { return "<"+T+Param+">"+Body+"</"+T+">";
    }
    static const FullTag a;
    //-------------------
    class ShortTag : public baseTag
    { public:
        ShortTag(const std::string &s) : baseTag(s) {}
        ShortTag(const char        *s) : baseTag(s) {}
    };
    static std::string Tag(const ShortTag &T, const std::string &Param)
    { return "<"+T+Param+" />";
    }
    static const ShortTag input;
};
 
const cTag::FullTag cTag::a="a";
const cTag::ShortTag cTag::input="input";
 
int main(int argc, char *argv[], char *env[])
{ system("clear");
  std::cout<<cTag::Tag(cTag::a    ," b","c")<<std::endl;
  std::cout<<cTag::Tag(cTag::input," b"    )<<std::endl;
  std::cout<<cTag::Tag(cTag::a    ," b"    )<<std::endl;
  std::cout<<cTag::Tag(cTag::input," b","c")<<std::endl;
  return 0;
}
Я надеялся, что строки 37 и 38 не будут компилироваться, т.к. функции cTag::Tag не описаны для соответствующих сочетаний типа первого параметра и числа параметров.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2011, 14:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка функций (C++):

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов - C++
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг у вас они завалялись на компе или...

Перегрузка функций. Реализация функций - C++
Разработать функцию f(x) , которая возвращает младшую цифру натурального числа x . Вычислить с ее помощью значение выражения z= f(a) +...

Перегрузка функций - C++
Здравствуйте ув. программисты не могли бы мне кто нибуть написать простейшие примеры перегрузки +, -, логичное или , и умножения.

Перегрузка функций - C++
Определить функцию, возвращающую расстояние между точками числа. Выполнить перегрузку функции для следующих типов параметров: Два параметра...

Перегрузка функций - C++
Всем привет! Дано задание : написать программу для работы с двумерными массивами, которая будет содержать перегруженные функции для...

Перегрузка функций - C++
Здравствуйте ! Попробовал выполнить задание, но есть проблемы...Кто может проверит а ошибки... Задание: АДТ - одномерный массив...

11
PointsEqual
24.08.2011, 14:35
  #2

Не по теме:

Цитата Сообщение от skvor Посмотреть сообщение
class baseTag : public std::string
нельзя наследовать

0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.08.2011, 15:30 #3
Цитата Сообщение от PointsEqual Посмотреть сообщение
нельзя наследовать
Можно. А вот полиморфно использовать уже нельзя. Так что лучше закрытое наследование или агрегирование.

Добавлено через 7 минут
А вообще странно. Судя по коду должна быть ошибка. Точно компилируется?
0
PointsEqual
ниначмуроФ
837 / 521 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
24.08.2011, 15:32 #4
почему можно?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.08.2011, 15:33 #5
Цитата Сообщение от PointsEqual Посмотреть сообщение
почему можно?
А почему нельзя? Если не планируется полиморфное использование, то никаких проблем.
0
PointsEqual
ниначмуроФ
837 / 521 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
24.08.2011, 15:35 #6
Цитата Сообщение от Deviaphan Посмотреть сообщение
А почему нельзя
насколько я знаю basic_string не имеет виртуального деструктора
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.08.2011, 15:54 #7
А для кого я написал:
Цитата Сообщение от Deviaphan Посмотреть сообщение
Если не планируется полиморфное использование
Как бы наследование используется не только для реализации полиморфизма.

Добавлено через 16 минут
Тут недавно спрашивали, зачем нужно указывать explicit в конструкторах? Так вот!
Если в данном примере указать explicit (что следовало сделать в самом начале), то проявляются ошибки компиляции, которые и отел получить ТС.
Не забывайте указывать explicit для конструкторов.

Собственно, в чём была проблема:
FullTag ЯВЛЯЛСЯ строкой, которая неявно приводилась к ShotTag. То же происходило и для ShortTag.
Этого можно было избежать используя закрытое наследование от std::string.
1
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
24.08.2011, 16:26 #8
Я, честно говоря, вообще не вижу смысла в наследовании от строки в данной задаче. Композиция вполне подошла бы.
0
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
24.08.2011, 17:40  [ТС] #9
Цитата Сообщение от Deviaphan Посмотреть сообщение
А вообще странно. Судя по коду должна быть ошибка. Точно компилируется?
Да и компилируется и запускается
<a b>c</a>
<input b />
<a b />
<input b>c</input>
Мне кажется, проблема из-за оператора присваивания, который наследуется от std::string
C++
1
2
3
4
cTag:: FullTag vFullTag ="Full_Tag";
cTag::ShortTag vShortTag="Short_Tag";
vFullTag=vShortTag;
cTag::FullTag vFullTag2(vShortTag);
- вот тоже компилируется и 3-я строка вызывает вопрос: почему у cTag::FullTag существует оператор = для cTag::ShortTag? Ведь оператор = определен только в std::string и нет явных оснований разрешать его для неизвестных (std::string-у) типов.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.08.2011, 18:51 #10
Цитата Сообщение от skvor Посмотреть сообщение
Мне кажется, проблема из-за оператора присваивания
В посте №7 я всё разжевал.

Добавлено через 59 секунд
Цитата Сообщение от silent_1991 Посмотреть сообщение
не вижу смысла в наследовании от строки в данной задаче.
Смысл в нежелании писать метод доступа к строке.)
1
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
24.08.2011, 19:29  [ТС] #11
Спасибо, explicit помог
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
class cTag
{ private:
    class baseTag : public std::string
    { public:
        baseTag(const std::string &s) : std::string(s) {}
        baseTag(const char        *s) : std::string(s) {}
    };
  public:
    class FullTag  : public baseTag
    { public:
        explicit FullTag(const std::string &s) : baseTag(s) {}
        explicit FullTag(const char        *s) : baseTag(s) {}
    };
    static std::string Tag(const FullTag &T, const std::string &Param, const std::string &Body)
      { return "<"+T+Param+">"+Body+"</"+T+">";}
    static const FullTag a;
    //-----
    class ShortTag : public baseTag
    { public:
        explicit ShortTag(const std::string &s) : baseTag(s) {}
        explicit ShortTag(const char        *s) : baseTag(s) {}
    };
    static std::string Tag(const ShortTag &T, const std::string &Param)
      { return "<"+T+Param+" />"; }
    static const ShortTag input;
};
 
const cTag:: FullTag cTag::a("a");
const cTag::ShortTag cTag::input("input");
 
int main(int argc, char *argv[], char *env[])
{ system("clear");
 
  std::cout<<cTag::Tag(cTag::a    ," b","c")<<std::endl;
  std::cout<<cTag::Tag(cTag::input," b"    )<<std::endl;
  //std::cout<<cTag::Tag(cTag::a    ," b"    )<<std::endl;
  //std::cout<<cTag::Tag(cTag::input," b","c")<<std::endl;
 
  cTag:: FullTag vFullTag ("Full_Tag");
  cTag::ShortTag vShortTag("Short_Tag");
  //vFullTag=vShortTag;
  cTag::FullTag vFullTag2(vShortTag);
 
  return 0;
}
Осталась только 42 строка, но мне кажется, от этого не избавиться без принципиальной переделки класса. Т.е. vShortTag при обращении через ссылку на std::string раскрывает все свои методы и данные, а попытка использования в наследовании вместо public baseTag private/protected baseTag не позволит компилировать функции cTag::Tag.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.08.2011, 19:39 #12
Ну так сделай конструктор копирования.)))
Но лучше перепроектируй, ибо лажа сейчас.)
1
24.08.2011, 19:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2011, 19:39
Привет! Вот еще темы с ответами:

Перегрузка функций - C++
АТД - множество с элементами типа int. Дополнительно перегрузить следующие операции: «+» - добавить элемент в множество(типа int +...

Перегрузка функций - C++
Добрый день! Скажите, пожалуйста, как функция перегружается в классе? Мне нужно подробное объяснение (в каком месте программного кода,...

Перегрузка функций - C++
Определить две функции с одним именем для решения задачи. Определить функцию, которая находит минимальное значение из двух чисел (числа...

перегрузка функций - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; class chisl { public: double x,y,z,a; void...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.