- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
struct LexicalToken
{
public:
LexicalToken(DataStructs::Lexem &lex,
SyntaxTree::SyntaxNode::Type type,
const IOSystem::Position &pos = IOSystem::Position()) :
lexem(lex), position(pos), type(type)
{}
LexicalToken(const LexicalToken &other) :
lexem(other.lexem), position(other.position), type(other.type)
{}
LexicalToken& operator = (const LexicalToken &other)
{
memcpy(this, &other, sizeof(LexicalToken));
return *this;
}
DataStructs::Lexem &lexem;
IOSystem::Position position;
SyntaxTree::SyntaxNode::Type type;
};
Elvenfighter 09.05.2011 12:46 # +4
Elvenfighter 10.05.2011 03:21 # +3
absolut 10.05.2011 10:37 # 0
ReL 10.05.2011 11:39 # −5
Elvenfighter 10.05.2011 15:25 # −3
А при наследовании какраз косяков не возникнет. А именно: при высходящем преобразовании ссылок/указателей они меняют свое значение, чтобы точно указывать на родительский обьект внутри дочернего. В результате работать будем всегда со ссылкой на нужный нам обьект, и копирование будет вполне адекватным.
ReL 11.05.2011 07:15 # −2
guest 11.05.2011 14:00 # 0
absolut 11.05.2011 14:57 # −2
Создай родительский класс и дочерний. У родителя реализуй оператор присваивания, а у потомка - нет. Потом проверь код:
guest 11.05.2011 16:37 # +3
SmackMyBitchUp 11.05.2011 20:35 # −3
TheCalligrapher 11.05.2011 21:58 # +1
Есть понятие наследования (inheritance), есть понятие видимости (visibility). Это - два совершенно разных понятия, друг к другу никакого отношения не имеющих.
Как я уже писал, оператор присваивания предка прекрасно наследуется потомком. Проблема только в том, что уналедованный оператор приваивания в потомке невидим (hidden). Вы, похоже, прекрасно заете, как сделать его видимым (unhide при помощи using-declaration). Но к наследованию/ненаследованию это никакого отношения не имеет, вопреки вашим ошибочным представлениям.
P.S. Отдельно стоит заметить, что в языке С++ нет понятия "дефолтного оператора присваивания". Есть понятие compiler-provided оператора присваивания (не знаю, как лучше сказать по-русски). Термин "дефолтный" (default) имеет в С++ особый, четко определенный смысл, к compiler-provided оператору присваивания никакого отношения не имеющий.
subaru 20.03.2018 22:30 # 0
> class_name & class_name :: operator= ( const class_name & ) = default;
а это что блядь?
TheCalligrapher 11.05.2011 21:52 # +1
Оператор присваивания - прекрасно наследуется. Не надо просто забывать, что он после этого скрывается оператором присваивания класса-наследника. Это тем не менее не отменяет того факта, что он наследуется.
Скрытый унаследованный оператор можно "открыть" при помощи using-декларации. Альтернативно, скрытый унаследованный оператор можно вызвать через квалифицированное имя.
С конструктором - другое дело. Он "не наследуется", но от этого никому ни жарко ни холодно, ибо язык С++ не предосталяет синтаксиса для вызова конструктора.
guest 12.05.2011 06:28 # −1
guest 12.05.2011 11:13 # +3
absolut 12.05.2011 11:27 # +1
guest 12.05.2011 11:35 # +1
TheCalligrapher 12.05.2011 21:43 # +3
Во-вторых, читать TC++PL надо таки в оригинале, а не в переводе Васи Гири из соседнего двора. Остюда, по-видимому, и терминологическая каша у тебя в голове.
В-третих, в TC++PL можно вычитать много чего, как например заявления о том, что у скалярных типов есть констукторы (что совершенно не верно). Не надо забывать о том, что TC++PL - это сознательно упрощенный учебник "для чайников" (сравните по объему стандарт языка и книгу Страуструпа), который никаким авторитетом в области формального/профессионального понимания языка не обладает. Язык С++ определяется его стандартной спецификацией, а не тем, что там понаписано в страуструповской книжке для пионеров, да еще и в непонятно каком переводе.
Поэтому, великодушно даю правило под запись: когда ты видишь расхождения с тем, что говорю я, и тем, что написано у Старауструпа в TC++PL, ты не в форум квакать лезешь, а быстренько берешь красный фломастер, аккуратненько вычеркиваешь соответствующий абзац из Страуструпа, а рядышком на полях приписываешь то, что сказал я, слово в слово. Заучиваешь перед сном. Повторяешь утром. Это, надеюсь, поможет тебе хоть чему-то научиться и избежать подобных публичных ляпаний задницей в лужу в будущем.
И наконец, в четвертых, "откровенная пурга" - она в твоей голове. Поэтому-то она тебе везде и мерещится.
absolut 12.05.2011 22:13 # +2
bugmenot 12.05.2011 22:58 # 0
TheCalligrapher 12.05.2011 23:51 # +3
SemaReal 21.03.2018 15:18 # 0
TheCalligrapher 12.05.2011 23:50 # +1
Все настолько стандартно-шаблонно, что меня, я думаю, по этому ответу в пять минут выгуглить можно.
guest 13.05.2011 06:59 # −2
guest 13.05.2011 11:39 # 0
TheCalligrapher 13.05.2011 19:24 # 0
Кстати, может у тебя какое-то особо "специальное" издание TC++PL? Не иначе как в переводе Васи Гири из соседнего двора...
P.S. Я надеюсь, не надо объяснять, что TC++PL - это и есть "Язык С++" авторства Б. Страуструпа?
g0cTb 21.03.2018 09:26 # 0
засунь свой петушиный стандарт себе в очко *lmfao*
bormand 21.03.2018 11:06 # +1
SemaReal 21.03.2018 15:35 # −1
g0cTb 21.03.2018 21:51 # 0
SemaReal 22.03.2018 00:37 # 0
inho 22.03.2018 00:50 # 0
guest 12.05.2011 06:51 # −2
ЛОМАЮЩИЕ ИЗВЕСТИЯ!
ГЛАВНАЯ БИБЛИЯ КРЕСТОБЛЯДЕЙ -- ГОВНОУЧЕБНИК!
БИЯРНЕ ТРУПОСТРАУС -- ГОВНОПИСАТЕЛЬ!
СПЕШИТЕ ВИДЕТЬ У ВСЕХ ПАРАШ СТРАНЫ!!
guest 12.05.2011 07:27 # +2
guest 12.05.2011 11:18 # 0
13.5.6
......Themeaning of the operators =, (unary) &, and , (comma), predefined for each type, can be changed for specific class and enumeration types by defining operator functions that implement these operators. Operatorfunctions are inherited in the same manner as other base class functions.
13.5.3.1
An assignment operator shall be implemented by a non-static member function with exactly one parameter.Because a copy assignment operator operator= is implicitly declared for a class if not declared by the user (12.8), a base class assignment operator is always hidden by the copy assignment operator of thederived class.
absolut 12.05.2011 11:46 # +2
TheCalligrapher 12.05.2011 21:45 # 0
Не разберешь только, кто постит - сплошные guest-ы...
TheCalligrapher 11.05.2011 22:07 # 0
3b18ada21d2d4cff 13.05.2011 13:43 # −3
3b18ada21d2d4cff 13.05.2011 13:43 # 0
там смотри sizeof(MEGASTRUCT) знаеш почему ?
видно ты ниразу не брал размер указателя когда хотел
узнать размер объекта
бывает есть имя переменной var ты автоматом пишеш sizeof(var)
и получаеш баг если это был указатель я подъебывался на этом
поэтому способ sizeof(MEGASTRUCT) обоснован и имеет право на жизнь
и более того именно так делает MS код в MSDN'е
bugmenot 13.05.2011 18:47 # 0
постить всякую
хуйню
в столбик
TheCalligrapher 13.05.2011 19:22 # +2
Еще раз: код должен быть настолько типонезависм, насколько это возможно. Имена типов используются только в декларациях, ибо именно для этого имена типов и предназначены. Использование имен типов вне деклараций - запрещается (за исключением узкого набора ситуаций, когда этого действительно не избежать). Вышеприведённое соврешенно неоправданое использование 'sizeof(тип)' - пример из аналов говнокодирования.
А MSDN... Ты хочешь сказать, что в MSDN полно говнокода? Кто бы мог подумать...
SemaReal 21.03.2018 15:40 # 0
TarasB 13.05.2011 11:08 # +3
А в Аде просто есть метод Adjust у класса Controlled, он заменяет и конструктор копирования, и оператор присвоения, и никакой такой еботни "наследуется/не наследуется" думать не надо.
absolut 13.05.2011 11:55 # −2
первый шаг к деградации :)
TarasB 13.05.2011 12:53 # +1
absolut 13.05.2011 13:00 # 0
TarasB 13.05.2011 13:41 # +1
guest 13.05.2011 13:53 # +8
guest 14.05.2011 10:39 # 0
bugmenot 14.05.2011 12:08 # +5
пропитые
roman-kashitsyn 29.11.2012 07:28 # +1
(What the world needs (I think) is not (a Lisp (with fewer parentheses)) but (an English a Russian (with more.)))
LispGovno 29.11.2012 09:09 # 0
roman-kashitsyn 29.11.2012 10:39 # +1
Lure Of Chaos 14.05.2011 10:35 # 0
absolut 14.05.2011 12:27 # −5
TheCalligrapher 14.05.2011 23:20 # +1
Lure Of Chaos 14.05.2011 23:25 # +1
Elvenfighter 29.11.2012 03:04 # −1
LispGovno 29.11.2012 06:59 # 0
inho 21.03.2018 09:32 # 0
Какая в жопу Ада? Ты в прошлом веке живешь?
SemaReal 21.03.2018 15:42 # 0
vistefan 21.03.2018 15:47 # 0
subaru 21.03.2018 15:53 # 0
vistefan 21.03.2018 16:13 # −1
А они где-то необходимы? Это ж вроде для того, чтобы кусок памяти воспринимать как хочешь, например как число и строку одновременно. Грязный низкоуровневый трюк, который в соответствующих ситуациях и используется.
В паскале делать такое же ещё уёбищнее, там придётся заранее знать все варианты, делать определение типа с case с дурацким синтаксисом, и размер типа будет такой, какой у самого большого из case.
> утечки
А с этим в паскале лучше?
SemaReal 21.03.2018 15:58 # 0
Но уже лет 20 как понятно кто победил, так что кроме ностальгии других применений у паскаля, ады и оберона нет
vistefan 21.03.2018 16:19 # 0
Как же? Разве что не используется как приём, потому что Вирт там концептуально на каждом шагу написал: the cake is lie это грязный хак. А так-то кто тебе мешает.
> структуры данных более логичны
Вот этого не понимаю. Что ты имеешь ввиду.
Вирт, насколько я понимаю, делал языки такими, чтобы для них было просто написать компилятор. Создатель языка как бы выбирает одно из двух зол — сложную реализацию языка, либо избыточный или сложный синтаксис.
Ну типа язык будет либо сложен для человека и прост для компьютера, либо наоборот.
Умиляет только, что Денису Ритчи удалось создать язык со сложным синтаксисом и очень сложной реализацией.
SemaReal 21.03.2018 18:24 # 0
Ну, в BP не было:) Там был Inc(), а на произвольное число было не подвинуться.
>>Что ты имеешь ввиду.
Subranges были например(sun..sat) и enumы были не обертками вокруг инта, можно было (емнип)возвращать массивы и строки итд.
Вообще сам синтаксис определения типабыл более стройный:ты определял тип с помощью ключ слова type, да и запись var:type лучше чем "type var" это уже все поняли.
А еще оператор присваивания не возвращал значения, и это не позволяло писать кулхацкерскеий код, зато код был чище)
В целом паскаль более академичный язык, не зря он был лучшим ЯПом для обучения
>>Вирт, насколько я понимаю, делал языки такими, чтобы для них было просто написать компилятор
ну при этом синтаксис паскаля намного проще синтаксиса сей)
3.14159265 21.03.2018 18:05 # 0
Разве?
В любом случае в си ключевые слова и значки короче.
SemaReal 21.03.2018 18:11 # 0
3.14159265 21.03.2018 18:18 # 0
http://wiki.freepascal.org/Reserved_words
http://tigcc.ticalc.org/doc/keywords.html
SemaReal 21.03.2018 18:29 # 0
3.14159265 21.03.2018 18:33 # 0
Там for крайне уёбищный: downto/to. Ну вот не могли нормальный произвольный инкремент запилить?
>и конструкции языка (типа then)
Тогда сравнение некорректное получится. then — вполне ключевое слово. В сишке в список даже типы включены.
Еще label не имеет аналогов. С какой целью заёбывать программиста объявлять метки?
doctor_stertor 21.03.2018 20:38 # 0
Если ты про обращение к счётчику, то всё с этим норм.
Всё дело в том, как работает цикл. For..Do считает границы 1 раз, while..do столько раз, сколько выполнится цикл.
3.14159265 21.03.2018 18:21 # 0
на циклы repeat/until/for/do/while; у си for и do while
на методы: function/procedure; у си void
лишний then, итд
3.14159265 21.03.2018 18:03 # 0
Решил пооткапывать все треды и пообщаться с Тарасом.
guest8 08.04.2019 20:44 # −999
guest8 08.04.2019 21:20 # −999
guest8 08.04.2019 22:10 # −999
guest8 09.04.2019 10:35 # −999