- 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;
};
А при наследовании какраз косяков не возникнет. А именно: при высходящем преобразовании ссылок/указателей они меняют свое значение, чтобы точно указывать на родительский обьект внутри дочернего. В результате работать будем всегда со ссылкой на нужный нам обьект, и копирование будет вполне адекватным.
Создай родительский класс и дочерний. У родителя реализуй оператор присваивания, а у потомка - нет. Потом проверь код:
Есть понятие наследования (inheritance), есть понятие видимости (visibility). Это - два совершенно разных понятия, друг к другу никакого отношения не имеющих.
Как я уже писал, оператор присваивания предка прекрасно наследуется потомком. Проблема только в том, что уналедованный оператор приваивания в потомке невидим (hidden). Вы, похоже, прекрасно заете, как сделать его видимым (unhide при помощи using-declaration). Но к наследованию/ненаследованию это никакого отношения не имеет, вопреки вашим ошибочным представлениям.
P.S. Отдельно стоит заметить, что в языке С++ нет понятия "дефолтного оператора присваивания". Есть понятие compiler-provided оператора присваивания (не знаю, как лучше сказать по-русски). Термин "дефолтный" (default) имеет в С++ особый, четко определенный смысл, к compiler-provided оператору присваивания никакого отношения не имеющий.
> class_name & class_name :: operator= ( const class_name & ) = default;
а это что блядь?
Оператор присваивания - прекрасно наследуется. Не надо просто забывать, что он после этого скрывается оператором присваивания класса-наследника. Это тем не менее не отменяет того факта, что он наследуется.
Скрытый унаследованный оператор можно "открыть" при помощи using-декларации. Альтернативно, скрытый унаследованный оператор можно вызвать через квалифицированное имя.
С конструктором - другое дело. Он "не наследуется", но от этого никому ни жарко ни холодно, ибо язык С++ не предосталяет синтаксиса для вызова конструктора.
Во-вторых, читать TC++PL надо таки в оригинале, а не в переводе Васи Гири из соседнего двора. Остюда, по-видимому, и терминологическая каша у тебя в голове.
В-третих, в TC++PL можно вычитать много чего, как например заявления о том, что у скалярных типов есть констукторы (что совершенно не верно). Не надо забывать о том, что TC++PL - это сознательно упрощенный учебник "для чайников" (сравните по объему стандарт языка и книгу Страуструпа), который никаким авторитетом в области формального/профессионального понимания языка не обладает. Язык С++ определяется его стандартной спецификацией, а не тем, что там понаписано в страуструповской книжке для пионеров, да еще и в непонятно каком переводе.
Поэтому, великодушно даю правило под запись: когда ты видишь расхождения с тем, что говорю я, и тем, что написано у Старауструпа в TC++PL, ты не в форум квакать лезешь, а быстренько берешь красный фломастер, аккуратненько вычеркиваешь соответствующий абзац из Страуструпа, а рядышком на полях приписываешь то, что сказал я, слово в слово. Заучиваешь перед сном. Повторяешь утром. Это, надеюсь, поможет тебе хоть чему-то научиться и избежать подобных публичных ляпаний задницей в лужу в будущем.
И наконец, в четвертых, "откровенная пурга" - она в твоей голове. Поэтому-то она тебе везде и мерещится.
Все настолько стандартно-шаблонно, что меня, я думаю, по этому ответу в пять минут выгуглить можно.
Кстати, может у тебя какое-то особо "специальное" издание TC++PL? Не иначе как в переводе Васи Гири из соседнего двора...
P.S. Я надеюсь, не надо объяснять, что TC++PL - это и есть "Язык С++" авторства Б. Страуструпа?
засунь свой петушиный стандарт себе в очко *lmfao*
ЛОМАЮЩИЕ ИЗВЕСТИЯ!
ГЛАВНАЯ БИБЛИЯ КРЕСТОБЛЯДЕЙ -- ГОВНОУЧЕБНИК!
БИЯРНЕ ТРУПОСТРАУС -- ГОВНОПИСАТЕЛЬ!
СПЕШИТЕ ВИДЕТЬ У ВСЕХ ПАРАШ СТРАНЫ!!
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.
Не разберешь только, кто постит - сплошные guest-ы...
там смотри sizeof(MEGASTRUCT) знаеш почему ?
видно ты ниразу не брал размер указателя когда хотел
узнать размер объекта
бывает есть имя переменной var ты автоматом пишеш sizeof(var)
и получаеш баг если это был указатель я подъебывался на этом
поэтому способ sizeof(MEGASTRUCT) обоснован и имеет право на жизнь
и более того именно так делает MS код в MSDN'е
постить всякую
хуйню
в столбик
Еще раз: код должен быть настолько типонезависм, насколько это возможно. Имена типов используются только в декларациях, ибо именно для этого имена типов и предназначены. Использование имен типов вне деклараций - запрещается (за исключением узкого набора ситуаций, когда этого действительно не избежать). Вышеприведённое соврешенно неоправданое использование 'sizeof(тип)' - пример из аналов говнокодирования.
А MSDN... Ты хочешь сказать, что в MSDN полно говнокода? Кто бы мог подумать...
А в Аде просто есть метод Adjust у класса Controlled, он заменяет и конструктор копирования, и оператор присвоения, и никакой такой еботни "наследуется/не наследуется" думать не надо.
первый шаг к деградации :)
пропитые
(What the world needs (I think) is not (a Lisp (with fewer parentheses)) but (an English a Russian (with more.)))
Какая в жопу Ада? Ты в прошлом веке живешь?
А они где-то необходимы? Это ж вроде для того, чтобы кусок памяти воспринимать как хочешь, например как число и строку одновременно. Грязный низкоуровневый трюк, который в соответствующих ситуациях и используется.
В паскале делать такое же ещё уёбищнее, там придётся заранее знать все варианты, делать определение типа с case с дурацким синтаксисом, и размер типа будет такой, какой у самого большого из case.
> утечки
А с этим в паскале лучше?
Но уже лет 20 как понятно кто победил, так что кроме ностальгии других применений у паскаля, ады и оберона нет
Как же? Разве что не используется как приём, потому что Вирт там концептуально на каждом шагу написал: the cake is lie это грязный хак. А так-то кто тебе мешает.
> структуры данных более логичны
Вот этого не понимаю. Что ты имеешь ввиду.
Вирт, насколько я понимаю, делал языки такими, чтобы для них было просто написать компилятор. Создатель языка как бы выбирает одно из двух зол — сложную реализацию языка, либо избыточный или сложный синтаксис.
Ну типа язык будет либо сложен для человека и прост для компьютера, либо наоборот.
Умиляет только, что Денису Ритчи удалось создать язык со сложным синтаксисом и очень сложной реализацией.
Ну, в BP не было:) Там был Inc(), а на произвольное число было не подвинуться.
>>Что ты имеешь ввиду.
Subranges были например(sun..sat) и enumы были не обертками вокруг инта, можно было (емнип)возвращать массивы и строки итд.
Вообще сам синтаксис определения типабыл более стройный:ты определял тип с помощью ключ слова type, да и запись var:type лучше чем "type var" это уже все поняли.
А еще оператор присваивания не возвращал значения, и это не позволяло писать кулхацкерскеий код, зато код был чище)
В целом паскаль более академичный язык, не зря он был лучшим ЯПом для обучения
>>Вирт, насколько я понимаю, делал языки такими, чтобы для них было просто написать компилятор
ну при этом синтаксис паскаля намного проще синтаксиса сей)
Разве?
В любом случае в си ключевые слова и значки короче.
http://wiki.freepascal.org/Reserved_words
http://tigcc.ticalc.org/doc/keywords.html
Там for крайне уёбищный: downto/to. Ну вот не могли нормальный произвольный инкремент запилить?
>и конструкции языка (типа then)
Тогда сравнение некорректное получится. then — вполне ключевое слово. В сишке в список даже типы включены.
Еще label не имеет аналогов. С какой целью заёбывать программиста объявлять метки?
Если ты про обращение к счётчику, то всё с этим норм.
Всё дело в том, как работает цикл. For..Do считает границы 1 раз, while..do столько раз, сколько выполнится цикл.
на циклы repeat/until/for/do/while; у си for и do while
на методы: function/procedure; у си void
лишний then, итд
Решил пооткапывать все треды и пообщаться с Тарасом.