Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
24.08.2011, 14:21     Перегрузка функций #1
Задача: создать объект формирующий 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 не описаны для соответствующих сочетаний типа первого параметра и числа параметров.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
24.08.2011, 14:35
  #2

Не по теме:

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

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

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

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

Собственно, в чём была проблема:
FullTag ЯВЛЯЛСЯ строкой, которая неявно приводилась к ShotTag. То же происходило и для ShortTag.
Этого можно было избежать используя закрытое наследование от std::string.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.08.2011, 16:26     Перегрузка функций #8
Я, честно говоря, вообще не вижу смысла в наследовании от строки в данной задаче. Композиция вполне подошла бы.
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-у) типов.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.08.2011, 18:51     Перегрузка функций #10
Цитата Сообщение от skvor Посмотреть сообщение
Мне кажется, проблема из-за оператора присваивания
В посте №7 я всё разжевал.

Добавлено через 59 секунд
Цитата Сообщение от silent_1991 Посмотреть сообщение
не вижу смысла в наследовании от строки в данной задаче.
Смысл в нежелании писать метод доступа к строке.)
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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2011, 19:39     Перегрузка функций
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.08.2011, 19:39     Перегрузка функций #12
Ну так сделай конструктор копирования.)))
Но лучше перепроектируй, ибо лажа сейчас.)
Yandex
Объявления
24.08.2011, 19:39     Перегрузка функций
Ответ Создать тему

Метки
объекты, параметры функций, Перегрузка
Опции темы

Текущее время: 04:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru