Это копия, сохраненная 1 июня 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Лабы идут на хуй.
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Все идут на хуй.
Тег [code] работает через жабаскрипт-костыль: https://github.com/ololoepepe/MakabaCode
Предыдущий: >>462718
https://ololoepepe.me/board/pr
https://github.com/ololoepepe/ololord
Чейнджлог с прошлого раза:
+ Теперь на всех досках на 1 капчу 10 постов.
+ Для того, чтобы свести влияние пинга к минимуму, файлы из треда качаются параллельно по две штуки разом.
+ Разметка немного допилена (не помню уже, что именно менял, вроде чтоб ссылки лучше определялись).
+ Реализован новый быстрый поиск. Index-based, так сказать. Работает быстрее, чем ты тилибонькаешь свой стручок.
+ Исправлено добавление ссылок на посты при получении новых постов AJAX-ом.
+ Алерты заменены на всплывающие сообщения.
+ Исправлено отображение превью постов.
+ Добавлена возможность удалять файлы без удаления постов.
+ На доске /echo/ добавлена возможность редактировать ссылку на внешний трендель. В целом увеличена гибкость шаблонов и скриптов для создания нестандартных досок.
+ Добавлена доска /rpg/ для рпг-тредов (популярны на ычане). На этой доске имеется встроенная система голосования (ибо специфика такая).
+ Предусмотрена возможность добавлять доски, где нельзя постить файлы, и при этом можно создавать треды (раньше тред без файла никак нельзя было создать).
+ Примерно в 10-15 раз увеличена скорость рендеринга тредов/досок (закеширована одна тяжелая операция).
+ Добавлен диалог настроек. Настройки времени и стиля помещены туда.
+ Добавлена возможность выбирать тип капчи. В /pr/ железно зашита кодерская капча для защиты от дебилов.
+ Добавлена поддержка яндекс-капчи (горите в аду, суки, за такой уебанский апи).
+ Исправлено ошибочное отображение нулевого (0x0) разрешения для аудио- и видеофайлов.
+ Исправлено отображение ошибки при постинге, если ошибка произошла не на сервере, а где-то в пути (прокся не пустила и т.п.).
+ Добавлена возможность быстрого ответа на выбранный пост (форма телепортируется прямо к посту, потом уходит на место).
+ Добавлена возможность отрендерить все посты заново (при изменениях в разметке, например).
+ Рендеринг постов теперь выполняется вне транзакции.
+ Отрефакторены скрипты, теперь это чуть меньший быдлокод, чем был, хотя все равно та еще дрисня.
+ Постинг теперь осуществляется при помощи XHR, избавился от хака с использованием iframe. Бонус - отображение процесса загрузки.
+ Добавлен класс конфигурируемой доски (ура, слава яйцам!), теперь не обязательно на каждую доску делать свой класс, достаточно задать имя и название.
https://ololoepepe.me/board/pr
https://github.com/ololoepepe/ololord
Чейнджлог с прошлого раза:
+ Теперь на всех досках на 1 капчу 10 постов.
+ Для того, чтобы свести влияние пинга к минимуму, файлы из треда качаются параллельно по две штуки разом.
+ Разметка немного допилена (не помню уже, что именно менял, вроде чтоб ссылки лучше определялись).
+ Реализован новый быстрый поиск. Index-based, так сказать. Работает быстрее, чем ты тилибонькаешь свой стручок.
+ Исправлено добавление ссылок на посты при получении новых постов AJAX-ом.
+ Алерты заменены на всплывающие сообщения.
+ Исправлено отображение превью постов.
+ Добавлена возможность удалять файлы без удаления постов.
+ На доске /echo/ добавлена возможность редактировать ссылку на внешний трендель. В целом увеличена гибкость шаблонов и скриптов для создания нестандартных досок.
+ Добавлена доска /rpg/ для рпг-тредов (популярны на ычане). На этой доске имеется встроенная система голосования (ибо специфика такая).
+ Предусмотрена возможность добавлять доски, где нельзя постить файлы, и при этом можно создавать треды (раньше тред без файла никак нельзя было создать).
+ Примерно в 10-15 раз увеличена скорость рендеринга тредов/досок (закеширована одна тяжелая операция).
+ Добавлен диалог настроек. Настройки времени и стиля помещены туда.
+ Добавлена возможность выбирать тип капчи. В /pr/ железно зашита кодерская капча для защиты от дебилов.
+ Добавлена поддержка яндекс-капчи (горите в аду, суки, за такой уебанский апи).
+ Исправлено ошибочное отображение нулевого (0x0) разрешения для аудио- и видеофайлов.
+ Исправлено отображение ошибки при постинге, если ошибка произошла не на сервере, а где-то в пути (прокся не пустила и т.п.).
+ Добавлена возможность быстрого ответа на выбранный пост (форма телепортируется прямо к посту, потом уходит на место).
+ Добавлена возможность отрендерить все посты заново (при изменениях в разметке, например).
+ Рендеринг постов теперь выполняется вне транзакции.
+ Отрефакторены скрипты, теперь это чуть меньший быдлокод, чем был, хотя все равно та еще дрисня.
+ Постинг теперь осуществляется при помощи XHR, избавился от хака с использованием iframe. Бонус - отображение процесса загрузки.
+ Добавлен класс конфигурируемой доски (ура, слава яйцам!), теперь не обязательно на каждую доску делать свой класс, достаточно задать имя и название.
Ну, знаешь, если уж компания, которая на этом специализируется, ничего не смогла сделать, то остается только расслабиться и получать удовольствие.
Алсо, хитрый план: можно взять там платный тариф и в случае, если они обосрутся, требовать с них денег (разумеется, больше чем заплатил сам).
Видел уже. Там везде какая-то ебень с дикими накрутками. А хочется его в чистом, незамутненном виде.
Сделай, алгоритм там описан. Если тебе надо разобраться, то разбирайся, иначе не вижу смысла не использовать готовые оптимизированные решения "с накрутками".
Бида в том, что мне крайне тяжело читать си-стайл, а реализацию в стиле плюсов найти не удается.
Лолшто? Сишку ж (без некоторых мелочей) можно считать подмножеством крестов. Синтаксис один в один, шо там функции, шо тут функции, только классов нет. Хз что там можно не осилить прочитать. Вот заголовок mpqs, что тебе там не понятно?
[code lang="c"]
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> / for memset /
#include <limits.h> / ULONG_MAX /
#include <sys/types.h>
#include <sys/resource.h>
#include "gmp.h"
#define FBASE ".fbase"
#define FULLS ".fulls"
#define PARTIALS ".partials"
#define PPS ".pps"
#define CYCLES ".cycles"
#define AVAL ".a_val"
#define STATUS ".status"
#define ADATA ".adata"
#define MATRIX ".matrix"
#define INDEX(p) ((p == -1) ? 0 : p)
typedef struct {
unsigned long q; / large prime /
mpz_t x;
unsigned int n; / number of primes stored /
unsigned int a; / number of primes allocated /
int p; / primes and/or indices /
unsigned int e; / exponents /
} relation_struct;
typedef relation_struct relation[1];
typedef struct _trie_t {
unsigned long p; / large prime /
struct _trie_t left;
struct _trie_t right;
} trie_t;
unsigned long count_lines (char);
void sort (unsigned long, unsigned long);
unsigned long uniq (unsigned long, unsigned long);
void init_relation (relation);
void clear_relation (relation);
int read_partial (relation, FILE, int);
int read_partial2 (relation, FILE , unsigned long );
int read_full (relation, FILE, unsigned long);
void realloc_relation (relation, unsigned int);
void copy_relation (relation, relation);
void output_relation (FILE , relation);
void output_relation_without_q (FILE , relation);
void output_relation2 (FILE , relation, mpz_t, mpz_t);
void count_odd_exponents (int, unsigned long, relation, unsigned long);
void read_params (mpz_t, unsigned long, unsigned long, char);
void multiply_relation (relation, relation, relation, mpz_t);
unsigned long read_factor_base (int , char , unsigned long);
int check_relation (relation, unsigned int , mpz_t);
int cputime (void);
unsigned long nextprime (unsigned long);
trie_t insert_prime (trie_t , unsigned long);
unsigned long trie_size (trie_t );
void trie_clear (trie_t );
int trie_contains (trie_t *, unsigned long);
void normalize_relation (relation, mpz_t);
void swap_relation (relation, relation);
double getprime (double);
unsigned long find_multiplier (mpz_t, double);
[/code]
Лолшто? Сишку ж (без некоторых мелочей) можно считать подмножеством крестов. Синтаксис один в один, шо там функции, шо тут функции, только классов нет. Хз что там можно не осилить прочитать. Вот заголовок mpqs, что тебе там не понятно?
[code lang="c"]
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> / for memset /
#include <limits.h> / ULONG_MAX /
#include <sys/types.h>
#include <sys/resource.h>
#include "gmp.h"
#define FBASE ".fbase"
#define FULLS ".fulls"
#define PARTIALS ".partials"
#define PPS ".pps"
#define CYCLES ".cycles"
#define AVAL ".a_val"
#define STATUS ".status"
#define ADATA ".adata"
#define MATRIX ".matrix"
#define INDEX(p) ((p == -1) ? 0 : p)
typedef struct {
unsigned long q; / large prime /
mpz_t x;
unsigned int n; / number of primes stored /
unsigned int a; / number of primes allocated /
int p; / primes and/or indices /
unsigned int e; / exponents /
} relation_struct;
typedef relation_struct relation[1];
typedef struct _trie_t {
unsigned long p; / large prime /
struct _trie_t left;
struct _trie_t right;
} trie_t;
unsigned long count_lines (char);
void sort (unsigned long, unsigned long);
unsigned long uniq (unsigned long, unsigned long);
void init_relation (relation);
void clear_relation (relation);
int read_partial (relation, FILE, int);
int read_partial2 (relation, FILE , unsigned long );
int read_full (relation, FILE, unsigned long);
void realloc_relation (relation, unsigned int);
void copy_relation (relation, relation);
void output_relation (FILE , relation);
void output_relation_without_q (FILE , relation);
void output_relation2 (FILE , relation, mpz_t, mpz_t);
void count_odd_exponents (int, unsigned long, relation, unsigned long);
void read_params (mpz_t, unsigned long, unsigned long, char);
void multiply_relation (relation, relation, relation, mpz_t);
unsigned long read_factor_base (int , char , unsigned long);
int check_relation (relation, unsigned int , mpz_t);
int cputime (void);
unsigned long nextprime (unsigned long);
trie_t insert_prime (trie_t , unsigned long);
unsigned long trie_size (trie_t );
void trie_clear (trie_t );
int trie_contains (trie_t *, unsigned long);
void normalize_relation (relation, mpz_t);
void swap_relation (relation, relation);
double getprime (double);
unsigned long find_multiplier (mpz_t, double);
[/code]
Ты ёбнутый? Новые крупные известные платформы появляются раз в 2-3 года, надо будет другой размер инта сделать — сделают. Надо будет другую реализацию — реализуют.
Ясно-понятно. Лучше выяснять, что Ъ, а что нет, чем писать код. Как и ожидалось от сосачевских клованов.
void f(int size) {
char buf[size];
...
}
Вот так написать в c99 можно, а в с++03\11\14 нельзя.
быстродополнение, на 17 стандарт, кажется был proposal на VLA
И что ты этим доказал? Это UB. Посмотри драфт стандарта. То, что это поддерживает gcc, не говорит о том, что это часть с++
в 14-х плюсах размера массива может быть constexpr
GCC и есть де-факто стандарт, похуй, что он отличается от официального. На спермоподелия строго похуй.
>и рантаймов с другим размером инта
Я что-то путаю, или по сишному стандарту инт 16 бит? Да вообще вопрос не в этом, а знаковом бите и т.д.
Я так понял, представление знакового от нуля до макс_инт не обязано совпадать с представлением беззнакового.
Стандарт не устанавливает конкретных размер ниодного типа, кроме char который равен 1 байту (при чем не важно сколько в нем бит). int должен соотвествовать самому оптимальному способу представления целого числа на конкретной архитектуре - что фактически значит что int должен быть равен машинному слову конкретного процесора.
Когда использовать weak_ptr? Желательно пример, в котором нету кэширования.
Берёшь, и используешь
Когда делаешь лабу по прожке, чем я собственно сейчас и занимаюсь. У меня возник порочный круг shared_ptr - enable_shared_from_this - weak_ptr. Никаких иных путей его разрешения, кроме как пихать инклюды посреди файлов не вижу, это норма?
переходи на раст
Та же фигня, бро. Ты работаешь?
это гну экстеншон
>>468799
>GCC и есть де-факто стандарт, похуй, что он отличается от официального.
вон из профессии, мразь
>>468845
>Я что-то путаю, или по сишному стандарту инт 16 бит?
1. базовым типом является char, размер которого в битах implementation defined
2. размеры всех типов считаются в кол-ве char'ов, sizeof возвращает размер в char'ах
3. на популярных платформах int имеет размер в 16 бит (DOS), 32 бит (Win/Lin), 64 бит (Linux)
4. на эмбеддед говне вообще может быть всё что угодно
5. для битоёбов есть типы int8_t, int16_t, int32_t
6. sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
>>468871
>У меня возник порочный круг shared_ptr - enable_shared_from_this - weak_ptr.
>порочный круг
wat?
>>468890
>С++11 и С++14, меняющийся Qt - как всё это держать в голове и иметь в виду?
1. между 11 и 14 выбирать сразу 14
2. куте существует только два (4 и 5) и там общие концепты
Язык до каждого ключевого слова + STL + Boost + Qt + какая-то предметная область (численные методы, сети, графика) + большая часть основных алгоритмов (сортировки, графы, это всё).
а вот всякие VSC++ норм или хуйня?
> Всегда ли двоичное представление положительных чисел для знаковых и беззнаковых типов совпадает? Или возможно "implementation defined"?
В стандарте такого нет. Единственно что они (типы) будут одинакового размера.
Ну ты и мразь.
Помогите с чтением из файла.
У меня записывается туда 8 структур по 4 строки и разделяются пробелами.
Как считать из файла каждую строку в новую переменную и после считывания последнего элемента перескочить через строку?
Удить я буду своим спиннингом в очке твоей мамаши. Только как бы сифилис не поймать.
ты ещё не знаешь на что подписываешся :D
+ многопоточность.
Про крестовую многопоточность можно почитать у:
http://www.amazon.com/C-Concurrency-Action-Practical-Multithreading/dp/1933988770
Ещё есть:
http://www.amazon.com/Introduction-Parallel-Programming-Peter-Pacheco/dp/0123742609
А у буста есть документация.
С клавиатуры хуячишь байты в файлы? Пример файла то приведи, блджад, нихуя не понятно, чего ты хочешь.
С клавиатуры ввожу несколько строчек:
Фамилия, дата рождения и т.д...
Записываю их в txt файл.
После этого мне нужно считать из файла эти данные и записать их в переменные.
ебанутые вопросы по памяти:
- в чем причина замены std::auto_ptr на std::unique_ptr
- разница между указателем на функцию и указателем на функцию-член-класса
- обеснить работу dynamic_cast, для чего он нужен, когда он может работать и как его можно поломать
- обеснить работу хеш-сетов (std::unordered_set)
- найти ошибку:
int x[100];
for (int p = x; p != x+sizeof(x); ++p)
p = 0;
А этими всеми стандартными умными указателями в реальной работе правда пользуются?
А в коде ошибка в том, что sizeof(x) нужно разделить на sizeof(int) (ну или просто написать p != x + 100) - компилятор при арифметических операциях над указателями учитывает за нас его тип и сам домножает числа на sizeof(тип).
> правда пользуются?
Да, удобно же. Хотя некоторые компании намеренно отказываются от всяких STL.
>Хотя некоторые компании намеренно отказываются от всяких STL.
Я вот об этом часто читал, мол они даже сами себе контейнеры пишут.
Чаще аллокаторы кастомные, говорят, что в гейдеве часто так делают при разработке двигла.
Но откуда мне знать, я же студент.
Ну это просто
>>469032
За вопросы спасибо, пошёл разбираться с указателями, остальное лёгкое.
int x[100]; for (int p = x; p != x+100; ++p) p = 0;
Мне интересны в первую очередь не вопросы, а именно знания — ходовые фреймворки (я кроме буста ничем никогда не пользовался), типовые задачи, которые возникают на работе, инструменты (valgrind сейчас в ходу?) и.т.п.
>>469053
> Чаще аллокаторы кастомные, говорят, что в гейдеве часто так делают при разработке двигла.
Да, действительно правда. Наш кастомный аллокатор std::map по производительности выше стандартного то ли на четыре порядка, то ли на пять.
Проклятая вакаба сожрала все звёздочки. Ещё рядом с p последним одна есть.
Яндекс, насколько я знаю, что-то там свое пилил. Но как-то у них все через жопу там.
Олсо, я обещал рассказать про КРОКовский семинар, который я посетил в среду.
Я вообще об этой компании мало чего знал, поэтому когда туда шел, то думал, что увижу двухэтажное чуханское здание. Однако это была 11 этажная йоба с собственным дата-цетром и прочими плюшками.
Семинар был довольно уныл. Я думал, что там будут рассказывать за какие-то технологии и задумки, однако нам поясняли за их продукты. Причем довольно поверхностно.
Доставило, что у них есть свой фреймворк. Вообще у них весь процесс поставлен на поток. Прототип программы они клепают на своем фреймворке чуть ли не мышкой, показывают заказчику, а потом уже начинают наращивать функционал.
Автоматическая сборка, тестирование -- вот это все. Даже некоторые проекты сбраывают заказчику, а он, в свою очередь, уже у себя их собирает и разворачивает.
Дико припекло от того, что они пишут исключительно на C#/Java, аргументируя это тем, что сейчас куда важнее удобство разработки, чем скорость работы программы. C++ они, конечно, тоже используют, но очень мало. Специфичные задачи типа распознавания пикч.
И ещё довольно расстроился, когда они сказали, что "ну в любом случае, когда студент приходит на собеседование, то он обычно пяток языков знает".
Офис у них пиздат. Можно было по нему гулять, чем мы и занялись. Автоматы с дешевыми снеками, пиздатенькая столовая и прочие плюшки. Хотя в офисе довольно жарко было. Угощали компотом, чаем и булочками.
> он обычно пяток языков знает
Вот ненавижу подобные формулировки, что значит "знает пяток"? Где границы того, что все они называют знанием технологии? Умение применять её на практике? Знание тонкостей работы платформы, о которых все вспоминают реже раза в год? Всё вместе?
Вот у меня от этого и полыхнуло. Я вот правил скрипты на bash, ruby. Писал программки на pascal, basic, python. Пилил сайты на php, дописывал к ним простенькие модули на Javascript, jQuery.
А ещё я один раз смотрел учебник Java и гонял примеры.
А значит ли это, что я знаю 8 ЯП + C++, ведь я на нем всякую лабуду пишу.
>Дико припекло от того, что они пишут исключительно на C#/Java, аргументируя это тем, что сейчас куда важнее удобство разработки, чем скорость работы программы.
Но ведь это здраво для бизнеса - какая разница, на чем рисовать окошки.
>ну в любом случае, когда студент приходит на собеседование, то он обычно пяток языков знает
Я в своём ВУЗе как минимум на пяти языках всякие императивные хелловорлды в течение семестра на каждый язык писал, лол.
>всякие императивные хелловорлды
Что это такое?
>Но ведь это здраво для бизнеса - какая разница, на чем рисовать окошки.
Meh. Это усложняет мне жизнь, ибо я хотел бы устроиться C++ бабуином.
Подобная фигня, только без веба. Тоже моделировал разные физические процессы на разных языках, кодил всякую обработку сигналов и изображений. За всё время обучения успел покодить на: C/C++, C#, Java, Scala, Haskell. С использованием всяких Qt, CUDA/OpenCL, Boost, OpenCV. Но понимаю, что для рынка вообще не представляю никакого интереса. Пишу диплом и думаю, что походу придётся преподавать какую-нибудь никому не нужную физику или переучиваться.
Ну я сел за написание ботнета. Поговаривают, что достаточно прибыльно. Ну и буду на собеседования ходить. Тут анончик писал, что таки устроился.
Олсо не смог ответить ни на один вопрос отсюдова >>469032 , так что дохуя чего надо будет изучить.
Наткнулся тут на какую-то пасту, где анон писал о том, что зря тратил время на учебники. Он писал всякие конспекты и пытался все учить. Сам так делаю, блядь. Сижу теперь озадаченный.
>Что это такое?
laba1.f90, laba2.cpp и laba3.java со всякими физическими и не очень задачками физфак же.
>Meh. Это усложняет мне жизнь, ибо я хотел бы устроиться C++ бабуином.
С++ бабуины не нужны, а быть Java/C# бабуином в 100 раз проще.
>>469070
Нужен, братишка, еще как нужен. http://isi.nfsoi.org/ http://isi.nfsoi.org/tasks
>С++ бабуины не нужны
Ну я, например, не очень в математике шарю. ВУЗ у меня специфичный, поэтому упора на математику нет. Такие дела. А я так понимаю, что сейчас на C++ никто не пишет без применение каких-то мат. залуп, да?
да почему же?
Я вот сферу деятельности немного менять планирую, например, этим летом и на плюсовика планирую устариваться, пока что сам подтягиваю знания по плюсам потихоньку, уверен что куда-нибудь да устроюсь.
Ну. Где нужен С++? Там где нужно что-то быстро вычислять. Ну или в игорях во всяких. В этих областях математики, наверное, немерено. Я ничего против неё, конечно, не имею, но мне нужно время, чтобы освоить её, причем самостоятельно.
А львиная доля всякого ынтерпрайза на всяких Java/C# пишется.
не обязательно связано с математикой. просто пройдись по вакансиям с++ на hh, сам удивишь, с математикой тут2 варианта обычно 1) игрострой 2) наука, но в ней обычно насрать на каком языке ты пишешь и какой знаешь, потребуется - выучишь
>что сейчас куда важнее удобство разработки, чем скорость работы программы
Вся суть крестоблядей. Оказывается нужно быстро код писать, а не искать утечки памяти. У меня так же пекло до момента когда я начал использовать буст и кутэ.
Парни, есть реквест:
В текстовике Пример строки:
“\033[31mThis text is red, \033[34mand this text is blue.”
Вывод:
Красным: This text is red, синим: and this text is blue.
Код, который написал я:
http://pastebin.com/dMDGsqzD
Проблема в том, что почему-то в массив пишутся совсем не те значения х, которые я предполагал => консоль не красится. Вместо следующими за [ — 3 и 1, я получаю два хуя, хранящихся в массиве - с подливой и без. Соответственно, я неправильно передвигаюсь по элементам массива (элемент x+1 нужно записывать как-то иначе?) или в чем дело?
Еще забыл поддержку различного сорта громадных энтерпрайдов, написанных на плюсах и которые переписывать в высшей степени нерентабельно.
Например, в ЕМС основной их флагман -- Clariion написан на плюсах и развивается, расширяется тоже плюсовыми разработчиками. Но зато все все новые проекты уже пишутся только на всяких джавах и дотнетах.
В многих других крупных компаниях также -- написано какое-нибудь крупное приложение на плюсах, его нужно поддерживать, расширять, наполнять фичами. Переписывать его целиком на более современный язык дорого. Вот в такие компании с++ разработчики активно требуются. И их довольно много.
Канонический быдлостуденческий говнокод-франкенштейн, собранный из кусков чужих лаб с фрагментами собственного уродства.
Вообще нихуя непонятно, что ты даже пытаешься сделать. Зачем ты инкрементируешь считанный символ? Ты вообще понимаешь, что строчка x++; не читает следующий символ из файла, а просто увеличивает значение символа на единицу?
>Канонический быдлостуденческий говнокод-франкенштейн, собранный из кусков чужих лаб с фрагментами собственного уродства.
проиграл, пеши есчо
Что-то мне подсказывает, что это гей-шлюховство от программирования. Хотя легаси есть везде, но это пиздец.
Ок, как читать не следующий символ, а, например, символ через 5 сиволов?
Прочитать пять символов и оставить пятый.
косвенные обращения
как накладывать структурки на память
замена рекурсии
+ ну и собственно прикладную область
Ну это вообще днище. Нас на втором курсе это все учили делать.
>>468998
Исходя из моего опыта хождения по собеседованиям спрашивают обычно следующее (но специфика очень сильно зависит от конкретной предметной области и спектра решаемых задач):
1. Понимание принципов ООП, умение внятно их описать и объяснить, зачем они нужны.
2. Знание основных STL-евских структур данных и алгоритмов. Понимание, чем отличаются контейнеры, каким образом данные в этих контейнерах хранятся.
3. Понимание, что такое О-символика, каково асимптотическое время выполнения базовых операций над контейнерами и почему вызывать std::sort для std::list -- плохая идея.
4. Знание основных алгоритмов сортировки, поиска, алгоритмов на графах, строках, умение внятно объяснить, как работают хеш-таблицы и основные деревья поиска.
5. Глубокое знание синтаксиса и особенностей языка. Канонический вопрос про виртуальный деструктор, понимание как реализован полиморфизм в языке, что такое таблица виртуальных функций, и т.п..
6. Понимание процесса сборки программы: компиляции, линковки. Что такое объявление и определение функции/переменной, для чего нужны заголовочные файлы, почему определение шаблонной функции нельзя поместить в .срр файл, оставив объявление в заголовочном.
7. Знание основ представления целых и вещественных чисел в памяти, стандарт IEEE 754, знание основ машинной арифметики, прямой, обратный, дополнительный код.
8. Знание базовых паттернов проектирования (синглтон, визитор и т.д., открываешь банду четырех и вперед по содержанию).
9. Понимание основ многопоточности. Что такое мьютекс, критическая секция, read/write mutex, promise/future.
Это так, навскидку. Может, еще чего вспомню, добавлю.
Почему компилятор не кричит о несоответствии типов и почему через указатель на B вызывается функция A?
то что
>на втором курсе это все учили делать
совсем не значит, что ты напишешь это на бумажке на собеседовании
>напишешь это на бумажке на собеседовании
Как с этим бороться? Вот не могу вообще без компьютера думать, только обсуждать что-то
Мне приходилось аналог сортировки слиянием писать на одном из собеседований.
А вообще, на ЕГЭ даже заставляют на бумажке писать довольно непростую (для школьника) программу. Так что взрослый дядя, претендующий на свои 50+к в месяц, уж должен уметь такие простые вещи как сортировки без ошибок писать.
>>469181
Практика. Берешь и пишешь простые вещи на бумажке. Начни с тех же сортировок, бинарного поиска.
>Почему компилятор не кричит о несоответствии типов
Потому, что ты вызываешь статик каст, лол. Попробуй использовать неявное приведение типов - компилятор ругнется.
>почему через указатель на B вызывается функция A
Потому, что у тебя объект как был класса A, так и остался A - ты преобразовал лишь указатель.
Алсо зачем вообще пихать в указатель класса наследника ссылку на объект класса родителя?
> через указатель на B вызывается функция A?
Потому что в в vtable указатель на метода A.
А вот по поводу хуиты со static_cast походу в стандарт лезть придётся.
> Почему компилятор не кричит о несоответствии типов
По твоему компилятор должен проанализировать весь твой код и понять, что у тебя по указателю на A лежит на самом деле экземпляр А, а не B?
Static_cast в отличие от dynamic_cast'а не производит проверок на реальное соответствие типа. Как можно догадаться из названия, он выполняется на этапе компиляции, поэтому он небезопасен.
Когда ты пишешь static_cast<B*>(a), ты как бы говоришь компилятору "слушай, братан, тут указатель a полюбому будет указывать на экземпляр класса В, поэтому не заморачивайся, а просто сделай приведение типа".
суть теста "написать Х на бумажке" --- проверить, не напиздел ли кандидат в своем резюме и он вообще не знает как программировать.
собственно тестировать этот кусок кода никто не будет и мелочи выковыривать не будут; могут только докопаться до важных граничных моментов --- например, в двоичном поиске или quicksort случай когда элементов один или два (там приколы с округлениями, если коряво написать, то можно зациклиться).
если хотят действительно проверить навыки, то дают тестовое задание на дом
>>469183
из реально ебанутого случая --- написать итератор по иерархическому дереву (типа дерева каталогов), который обходит все элементы дерева по одному разу
>>469191
тут нужно аккуратнее между тонкостями static_cast и reinterpret_cast, ты описываешь почти reinterpret_cast
>>469186
static_cast делает преобразование между двумя такими типа, для которых можно провести единственную цепочку по иерархии наследования либо существует оператор преобразования
в случае примера происходит т.н. upcast, т.е. преобразование от базового класса к производному
static_cast не может сделать преобразование например между классом A и int, т.к. нет оператора преобразования
также static_cast не может преобразовать от базового класса к последнему потомку в ромбе множественного наследования: когда есть class A; class B: public A; class C: public A; class D: public B, public C. в этом случае преобразование от указателя на A к указателю на D (и наоборот) невозможно ввиду того, что не понятно по какому пути производить преобразования
Ах, да, все наследники имеют используются для хранения всякой всячины, поэтому виртуальные функции ничего не решат, мне нужно именно понимать, кто передо мной.
typeid и прочие костыли. Обычно если тебе надо знать точный класс, то это хреновая архитектура.
Это ООП, дружок. typeid не поможет, я имею дело с объектом базового класса. typeid определяет класс с точностью до буковок.
не, суть в том, чтобы цикл
for (TreeIterator it = fs.begin(); it != fs.end(); ++it)
cout << *it << endl;
печатал бы имена всех файлов
а bfs/dfs --- это рекурсивный обход
Можно без рекурсии, если стэк юзать.
Как-то так должно быть
std::stack<TreeIterator> stack;
stack.push(root);
while (!stack.empty())
{
auto node = stack.top();
stack.pop();
std::cout << node->getName() << std::endl;
for (auto it = node->getChilds().begin(); it != node->getChilds().end(); ++it)
{
stack.push(*it);
}
}
Ну правильно. Внутри итератора рекурсивный обход, снаружи он печатает имена всех файлов.
Это называется "в С++ нет рефлексии".
class A
{
public virtual std::string getType() { return "A"; }
};
class B
{
public virtual std::string getType() { return "B"; }
};
Быстрее ли программы, связанные с библиотеками статично, программ, что связанны с библиотеками динамически? Или же во втором случае медленнее работает только первое обращение к какой-нибудь функции, а далее различий нету никаких?
Ужасное решение, как минимум потому что не использует систему типов, а реализует какой-то самопальный протокол поверх языка, вследствие чего будет работать очень медленно и ненадежно, не говоря уже о том, что реализовывать это придется очень коряво и с поддержкой будет не меньше проблем.
Вот с этим, попробую разобраться, спасибо.
> Но вед гцц намного лучше поддерживает стандарты плюсов, чем мсвц.
https://www.youtube.com/watch?v=zChEQuhK09M
А сели первое обращение медленнее, не значит ли, что медленнее работа с динамическими библиотеками вообще?
Но спермопараша при этом 14 стандарт полностью начнёт поддерживать хуй пойми когда.
#include <fstream>
std::ifstream ifs;
ifs.open("text.txt");
bool fail_1 = !ifs;
bool fail_2 = !ifs.is_open();
Всегда ли (fail_1 == fail_2)? Если нет, то когда?
Для тех, кому непонятно, что такое !ifs, это тоже что и ifs.fail()
По законам арифметики существует деление по модулю. С ним итерации пройдут за O(n), как в твоем варианте.
Не менее логичным вариантом будет прохождение каждых 4 индексов строки: http://ideone.com/5aY8ck
В итоге твой вариант пройдет полный цикл за n. Во втором варианте за n / 5.
Ну вот есть у меня библиотека с парой контейнеров. Очень часто используется в основном приложении. Мне её динамической или статической делать? Будет ли разница заметна?
>В итоге твой вариант пройдет полный цикл за n. Во втором варианте за n / 5.
Ты забыл учесть время которое тебе нужно для считывания в строку, а там О(n). В итоге у анона решение в один проход с константной памятью, у тябя два прохода (второй раз каждый пятый символ), плюс линейный расход памяти.
Один вопрос, какой ассеблер делать и как в него вообще пидорится? Есть какая-нибудь IDE? Как вообще запускать программки на асм?
>QMap<QPushButton *, QString>
Что это за бред? Храни строку в каком-нибудь свойстве кнопки, например
btn->setProperty("myString", "хуй говно пизда");
>какой ассеблер делать
Щито? Бери FASM, в нем много полезных фич.
>как в него вообще пидорится?
На том же васме можно найти туториал.
>Есть какая-нибудь IDE?
Нормальных не замечал.
>Как вообще запускать программки на асм?
Как и обычные программы, отличий-то нет.
это смахивает на незнание/неумение в mvc
няши, есть один код,
http://pastebin.com/RH5DQFQh
не понимаю как он работает,
объясните пожалуйста откуда берётся значение переменной b, и почему оно равно единице?
и всё-таки, откуда берётся переменная b, если она не передаётся как параметр? и почему эта переменная равна 1?
[code lang="cpp"]int b[] = { 5, 2, 3, 1, 8, 6 };[/code]
Вот твой массив b, который объявлен глобально. Вот это и есть твоя переменная b.
С чего ты взял, что она равна единице?
Функция f возвращает не значение, а указатель. Мы передаем этой функции число 2, а она возвращает указатель на третий элемент массива b. Это эквивалентно выражению cout << b[0+2].
Ты же сам определил функцию, которая возвращает УКАЗАТЕЛЬ на элемент массива. b[0+2] = b[2] = 3;
Лел. Мочепараша тормозит.
Я бы поставил на нет, да и вообще люблю линковать статически. Большинство крупных высокопроизводительных приложений это огроменные бинарники, куда динамически всё залинковано.
Скорее всего ты занят premature optimization.
> Есть какая-нибудь IDE?
Visual Studio? Пиши вставки же. Не знаю, кто сейчас вообще на ассемблере пишет, компилятор ассемблерщикам давным давно в рот суёт, не в последнюю очередь из-за зоопарка платформ
Я хочу просто отдавать отчет о том, что пишу на крестах. Маня-фантазия ОЧЕНЬ ОПТИМИЗИРОВАТЬ КОД у меня нет.
>компилятор ассемблерщикам давным давно в рот суёт
Nope.
>не в последнюю очередь из-за зоопарка платформ
А с этим трудно спорить, кроссплатформенность - штука хорошая.
Абсолютно разные по содержанию Elem(int), Elem(double), diffElem(int), и diffElem(double), но абсолютно одинаковые в плане синтаксиса Solution() и diffSolution() с точностью до замены первых двух функций на две последние. Как избавиться от копирования кода без лишних трудозатрат?
> Nope.
Можешь привести минимальный пример, где ассемблер обгоняет icpc или даже просто реализацию на mkl? Ну хоть чутка?
Или хоть ссылку на какую-нибудь обоссанную статью на хабре?
Я так понимаю, после gotoh никто ничего подобного не вытворял, хотя люди явно пытались.
Хабр не читаю, но про то, что компиляторы частенько тупят с векторизацией, знаю.
MKL это интеловская математическая библиотека? Скорее всего, там тоже куча вставок. Утверждать не буду, ибо не видел.
Два стула:
1. Указатели на функции или std::function
2. Паттерн:
http://cpp-reference.ru/patterns/behavioral-patterns/strategy/
> компилятор ассемблерщикам давным давно в рот суёт
Напоминаю в очередной раз.
http://thedeemon.livejournal.com/49226.html?thread=581962
Эта кьютеблядь порвалась, заносите следующую.
>>469553
> Хабр не читаю, но про то, что компиляторы частенько тупят с векторизацией, знаю.
С этим не борются ассемблерными вставками. С этим борются алиасингом, и написанием кода без выебонов, который вылавливает компилятор. И смыванием в унитаз GCC ещё. Пш-ш-ш-ш-ш.
> MKL это интеловская математическая библиотека? Скорее всего, там тоже куча вставок. Утверждать не буду, ибо не видел.
Периодически просачиваются куски кода на конференциях — не вставляют, как я понимаю. Даже если так, то вставки это инструмент уровня разработчика MKL, а не пользователя-программиста далеко.
>>469557
> Напоминаю в очередной раз.
В том и проблема, что раз очередной. Давай разберём по частям всё этим джентльменом написанное:
> MSVC8 (2006 год).
9 лет назад
> MSVC10 (2010 год).
5 назад
> Intel Compiler 7.1 (2003 год).
> Даем подсказку: <...> векторизует код ровно так же, как в примере с интринсиками. Укладывается в полсекунды.
12 лет назад
> Аналогичная подсказка MSVC всех версий ничего не дает, они продолжают разворачивать максимум по 4 итерации, никакого SSE.
Ну, параша и параша, MSVC годится только для отладки
> Intel Compiler 11 (2009 год). Одинарный цикл векторизует так же хорошо, как 7-й. В двойном цикле на этот раз догадывается хотя бы векторизовать внутренний, но тупит с выравниваниями, вставляя ненужный и неиспользуемый код по краям. 1 секунда.
6 лет назад. Векторизовал автоматически
> GCC 4.7.0 (2012 год). В двойном цикле полностью разворачивает внутренний, внутри imul, все как у intel 7. Те же 2 секунды. SSE? Не, не слышал. Если сделать цикл одинарным, сдюживает его векторизовать, но делает это плохо: вместо попарного сложения результатов умножения отдельно вычисляет верхние и нижние биты результатов, потом возится с перестановками и перепаковками байтов в регистрах. 1 секунда, вдвое хуже интела и варианта с ручной векторизацией.
Ой, ну про то, что GCC годится только для швабодки в срачельничек мы знаем. Хоть бы clang достали.
Мораль: этот джентльмен подтверждает мои тезисы.
Продолжим бичевание.
Господа, вы знаете, что на SSE свет клином не сошёлся? И что если интел векторизовал пять лет назад в SSE, то в этом году он будет векторизовать уже в AVX, причём кроссплатформенно, т.е. если есть AVX, то программу сбренчит на AVX, если нет, то на SSE, и вставочки будут у icpc сосать, причмокивания?
А знаете, что если это говно выполнять не велосипедируя, а используя MKL (или любой приличный аналог), то он будет задействовать не только векторизацию, но параллелизм, и кеш блокинг? Нет, не знаете? Я вас просветил.
Эта кьютеблядь порвалась, заносите следующую.
>>469553
> Хабр не читаю, но про то, что компиляторы частенько тупят с векторизацией, знаю.
С этим не борются ассемблерными вставками. С этим борются алиасингом, и написанием кода без выебонов, который вылавливает компилятор. И смыванием в унитаз GCC ещё. Пш-ш-ш-ш-ш.
> MKL это интеловская математическая библиотека? Скорее всего, там тоже куча вставок. Утверждать не буду, ибо не видел.
Периодически просачиваются куски кода на конференциях — не вставляют, как я понимаю. Даже если так, то вставки это инструмент уровня разработчика MKL, а не пользователя-программиста далеко.
>>469557
> Напоминаю в очередной раз.
В том и проблема, что раз очередной. Давай разберём по частям всё этим джентльменом написанное:
> MSVC8 (2006 год).
9 лет назад
> MSVC10 (2010 год).
5 назад
> Intel Compiler 7.1 (2003 год).
> Даем подсказку: <...> векторизует код ровно так же, как в примере с интринсиками. Укладывается в полсекунды.
12 лет назад
> Аналогичная подсказка MSVC всех версий ничего не дает, они продолжают разворачивать максимум по 4 итерации, никакого SSE.
Ну, параша и параша, MSVC годится только для отладки
> Intel Compiler 11 (2009 год). Одинарный цикл векторизует так же хорошо, как 7-й. В двойном цикле на этот раз догадывается хотя бы векторизовать внутренний, но тупит с выравниваниями, вставляя ненужный и неиспользуемый код по краям. 1 секунда.
6 лет назад. Векторизовал автоматически
> GCC 4.7.0 (2012 год). В двойном цикле полностью разворачивает внутренний, внутри imul, все как у intel 7. Те же 2 секунды. SSE? Не, не слышал. Если сделать цикл одинарным, сдюживает его векторизовать, но делает это плохо: вместо попарного сложения результатов умножения отдельно вычисляет верхние и нижние биты результатов, потом возится с перестановками и перепаковками байтов в регистрах. 1 секунда, вдвое хуже интела и варианта с ручной векторизацией.
Ой, ну про то, что GCC годится только для швабодки в срачельничек мы знаем. Хоть бы clang достали.
Мораль: этот джентльмен подтверждает мои тезисы.
Продолжим бичевание.
Господа, вы знаете, что на SSE свет клином не сошёлся? И что если интел векторизовал пять лет назад в SSE, то в этом году он будет векторизовать уже в AVX, причём кроссплатформенно, т.е. если есть AVX, то программу сбренчит на AVX, если нет, то на SSE, и вставочки будут у icpc сосать, причмокивания?
А знаете, что если это говно выполнять не велосипедируя, а используя MKL (или любой приличный аналог), то он будет задействовать не только векторизацию, но параллелизм, и кеш блокинг? Нет, не знаете? Я вас просветил.
Нда, самый просто вариант в моей laba1.cpp это именно указатели.
Ты не прав в том, что не привел никаких аргументов касательно кьюта. На конпеляторное байтоебство не я отвечал, мне это не интересно.
Хорошо. Моя аргументация относительно того, что кьют — говнина ебаная для неудачников базируется на двух китах. Внимай.
1) Кьют плох, как гуёвая библиотека. Плюсы (как и любой другой язык без сборки мусора) не предназначены для написания гуёв. От слова совсем. Там нельзя естественным образом использовать современные гуёвые парадигмы, код пишется очень медленно и глючный, IDE очень плохие. Единственное, зачем ещё держат кьют — кросплатформенность, но и там он весьма не очень. Кроссплатформенность достигается через еблю, тяжёлые либы, глючит под виндой, где сидит 99.99% гуепользователей... Программисты на Qt относительно дорогие, и в то же время, макаки, которые не отличают друг от друга компиляторы. Удел кьюта в качестве библиотеки — поддержка древнего легаси с ненавистью к своей потерянной жизни (т.е. для неудачников). Одна макака с решарпером заменяет целую группу кьютобезьян с тимлидом.
2) Для всего остального кьют не годится. Есть библиотеки, которые не требуют анального кьюторабства, легко заводятся с разными компиляторами, быстро изучаются и не навязывают свою парадигму программирования. Разонравилась библиотека? Выкинул из проекта за пару дней и заменил на конкурента. Всё, ты в дамках. А гуи напишут специально обученные люди, на чём-нибудь поприличнее. Как и любая монструозная свалка кьют обречён на гниение и вымирание.
Так лучше?
Кек. http://github.com/nukede/lobster
Дико извиняюсь за тот говнокод. Готовлю обновления, где хоть чуть-чуть прибрался, но тем не менее, в этой программе есть реализация поиска корня методом простых итераций.
Правда для систем линейных уравнений, но все сводится к трем операциям
1. Построить итеративную форму
2. Проверить сходимость ряда
3. Начать поиск приближения.
Олсо, ты можешь загуглить другие методы поиска приближенного корня.
> Что такое "Начальное приближение корня"?
Это число, достаточно близко аппроксимирующее решение уравнения
> И как найти корень?
Методом просто итерации. Что это такое написано в Википедии (не проверял, но уверен)
>Это число, достаточно близко аппроксимирующее решение уравнения
То есть мне его брать за корень, или зачем вообще оно дано?
>Что такое "Начальное приближение корня"?
Числа, с которых стартуешь приближать. В твоём случае это сначала 0, потом 11.
>И как найти корень?
ans = f(f...(f(x)))) (применяешь n раз), где f(x) = 0.25 * (1 - 2x^3) (выражаешь из уравнения x).
Тебе его брать как начало последовательности ответов. Чем больше ты проитерируешь - тем точнее будет последний элемент последовательности. Зачем тебе это вообще?
> То есть мне его брать за корень,
За первое приближение
> или зачем вообще оно дано?
Чтобы метод простой итерации сошёлся в два разных значения. Если начинать из произвольной точки то будет сходиться медленно, и, возможно, в одну и ту же точку, хотя корней тут может быть аж три.
А зачем решать СЛАУ методом простой итерации (кроме как laba5?)
Давно хотел с тобой поговорить, я вообще люблю решать СЛАУ
>Что это за ёбаный монстр?
Да. Я уже сказал, что лютый говнокод, постараюсь его обновить в ближайшее время.
>Что эта программа делает?
Есть некоторая система линейных алгебраических уравнений. Нужно вычислить корни данной системы уравнений с некоторой точностью. В файлике описываешь матрицу свободных членов, матрицу коэффициентов. И запускаешь программу, которая подбирает нужны ответ.
В программе нужно запилить нормальную многопоточность, переписать очередь (а то она уж совсем ублюдски реализована), ну и генерацию файла адекватней запилить.
Ты погуглил про метод простой итерации? Скинь в тред список прочитанных тобою источников.
Пиздос, я же тебе скинул готовую программу. Там есть класс SIM, в котором реализованы три необходимые функции. Хоть программа состоит из говна, да чего уж, даже этот класс немного смазан говном, но те три функции вполне неплохо описаны и выполняют свои задачи.
Препод не бугуртил, кстати.
Нет, кукарека, не засчитан. Аргументов то не было, только твои спермофантазии.
Так ты аргументируй. Подсказываю:
> На самом деле, кьют хорошь, как гуёвая библиотека, и вот почему: ...
Только когда ты приведешь аргументы, а не свою точку зрения. Цифры, примеры, вот это все.
Аргументы есть, слив засчитан, Qt объявляется обоссаным в этом треде до тех пор, пока не будет контраргументов или хоть детального разбора уже приведённых.
Ясно-понятно, как и ожидалось от кукареки. Пукнуть пукнул, а доказать не может.
Потому, что какая-никакая, но мультипплатформа. Потому, что годные сигналы/слоты. Потому, что хорошая документация и удобно использовать.
Какая-никакая кроссплатформенность везде, кроме мобильных устройств, достигается wine. При этом можно использовать другие фреймворки, с удобными IDE, написанной профессионалами документацией и, конечно, очень удобные. Сигналы/слоты с дополнительным шагом компиляции не очень нужны, для этого есть другие библиотеки, навскидку, буст.
> Моя аргументация относительно того, что кьют — говнина ебаная
> Кьют плох, как гуёвая библиотека.
> Плюсы (как и любой другой язык без сборки мусора) не предназначены для написания гуёв.
> нельзя естественным образом использовать современные гуёвые парадигмы,
> код пишется очень медленно и глючный
> IDE очень плохие.
> там он весьма не очень.
> тяжёлые либы,
> глючит под виндой...
> Программисты на Qt относительно дорогие,
> Одна макака с решарпером заменяет целую группу кьютобезьян с тимлидом.
> 2) Для всего остального кьют не годится.
> ...
> плохой потому что плохой
> сосёт потому что гавнина ебаная
> плохо зделали потому что тупа плоха
Вот и я ему намекаю на это, но экземпляр довольно упертый, долго еще маневрировать будет.
Хотя не, эт хуйня какая-то.
Это не контраргументы. Непонятно кем написанный wine блядь у него залог кроссплатформенности, ну охуеть теперь.
>можно использовать другие фреймворки
Ну можно, да. Можно и в жопу ябаться.
>с удобными IDE
Удобство у всех разное. Кому-то удобно и в емакс пёхаться.
>написанной профессионалами документацией
А кто, простите, документировал Qt? Школьники из 5б?
>сигналы/слоты не очень нужны
Ты не нужен, блядь.
>для этого есть другие библиотеки, навскидку, буст
Что лучше - использовать зоопарк библиотек или один Qt?
http://pastebin.com/VpNrxcRw
Вроде так, но хуй знает, правильно считает или не.
И что выводить нужно, x1 или x?
Берёшь и реализовываешь.
Открой еще раз ссылку, я там кое-что подправил, чтобы всё стало понятно даже дауну.
Так не работает ведь, сам попробуй запусти.
Вводишь любое e, результат не меняется.
+ В условии сравнивать с e нужно не x-f(x), а f(x)-x.
лолвут? abs - это модуль, если чё.
Ну и да, на x_0=11 программа валится, ничего страшного в этом нет - тебе никто не гарантировал, что метод последовательных итераций сходится всегда.
Вангую, что он просто прочитал пару статеек, нихуя не понял и требует от нас помощи. Я же написал, как реализуется задача.
1. Привести к итерационной форме
2. Проверить сходимость
3. Искать корни.
У него лабы горят, сейчас же зачеты начинаются.
> востребованы в программистских работах
Да, несмотря на то, что выглядит в бусте всё очень уёбищно
> стоит ли их заучивать
Заучивать – нет, поглядеть и поиграться – да
И еще, функция типа должна быть рекурсивной...
Что за виртуальные функции? Какой смысл перед объявлением функции писать слово virtual и зачем нужно объявлять виртуальные функции или чисто виртуальные? чем они отличаются от просто виртуальных? в абстрактных классах если всё равно надо переопределять в подклассах?
Открой любой учебник и прочитай про классы, наследование и виртуальные функции.
прочитал. нихуя не понял. пришол сюда. зачем они? Что они делают? в двух словах пояснить возможно?
Мать твою в жопу ими ебут. Теперь катись на хуй.
>>469721
Есть такая штука, которая называется полиморфизм, суть в двух словах: один интерфейс – одна реализация. Виртуальные функции – одно из средств реализации полиморфизма (полиморфизм подтипов).
> смысл перед объявлением функции писать слово virtual
Пример из вики ясно поясняет зачем:
http://goo.gl/ZafY7u
> чисто виртуальные? чем они отличаются от просто виртуальных?
Методы без реализации, так можно построить интерфейс, с этим разберёшься чуть позже. Иногда супертип не должен представлять собой что-то конкретное, а должен быть абстрактным.
Надеюсь, что ты не обиделся на саженяшу, он у нас бывает не в духе.
А теперь пиздуй внимательно шерстить учебник, ты бы ещё хелло ворлд попросил объяснить.
> один интерфейс – одна реализация
Обосрался, конечно же
один интерфейс – множество реализаций.
Спасибо. Так ничего и не понял. Пошёл перечитывать учебник. Долго ты ООП учил?
Я не учил, я лабы делал, с опытом приходит понимание. Делай задания, которые даются в конце глав. Какую книгу читаешь?
Ты его просто так не поймешь, почитав учебник. Пиши код, пробуй и поймешь. У нас сейчас ООП только Ruby читают. 80% потока нихуя не понимают.
Yep. У нас очень мало этого. Поэтому препод сказал, что нужно максимум дать, а кресты объяснять будет слишком долго. И он охуенно правильно сделал, ибо никто-нихуя-не-понимает. Пик стронгли релейтед.
Но препод просто 10/10. У нас с ним две пары в неделю. На первой, он дает нам лекцию, где поясняет за всякие ништяки. Например, сегодня он рассказывал на переполнение буффера и какие могут быть проблемы. Хоть я это и так знаю, но все равно с интересом послушал, ибо он все качественно оформляет и доступно рассказывает.
Ох уж это рашкообразование, нам наоборот всё разжёвывали и дали минимум, чтобы можно было чиселки в массивах складывать. Программирование длилось три семестра, последний при этом был выделен под изучение STL. Те, кто был минимально заинтересован, научились писать внятный код только к четвёртому курсу. Хотя у нас больше физическая специальность, но кодить требовали постоянно на других предметах.
Ну у нас, к сожалению, упор сделан на языки - английский, немецкий. О чем я дико жалею, но с другой стороны языки нужны, да.
К примеру, программирование у нас будет только в этом семестре. В общем, блядь, ну я не знаю. С одной стороны я ввязался в говно, надеясь на то, что будет что-то прогрессивное, но кроме языков, которые я пока не знаю, куда применить, я там не нашел ничего.
Хотя может быть, я буду когда-нибудь успешен и благодарен вузу. Олсо, препод по физике, пророчит мне зарплату под 9к ойро в гейропке и ставит в пример другими. А я горько усмехаюсь над ним, надеясь найти хоть какую-нибудь работу к окончанию вуза.
Освоение языка даст тебе минимальную базу ООП, конкретные книги про ООП читать потом будешь. Мне вот учебник Лафоре понравился, очень доступно для новичков объясняет.
Давай вместе им в ротешник ссать, кто больше нассыт. Пссссс, догоняй.
ООП тащемта любому нормальному человеку и так становится понятно, когда он пишет хоть сколько-нибудь код. Как и ФП, например.
Вот написал ты портянку, и думай как её отрефакторить. Если ты не совсем даун то быстро сообразишь, какие абстракции лучше всего подойдут.
Дай ты людям шанс, этот то без лабы пришёл, можно и рассказать чуть-чуть а потом нахуй послать.
Всё равно в треде почти нихуя не происходит.
>>469818
Тут уж дрочить на самообразование приходится, у большинства так. У некоторых студентов бывает шанс свалить на работку к научруку, вот этот шанс желательно не проябывать.
Двачую, был лучшим первые два курса по погроммированию. Тоже физическая специальность.
Кек. Ну хоть какое-то разнообразие, а то я сейчас на праздниках начну всякое говно кодить и срать сюда охуительными вопросами. Олсо, мы так и не решили. Хочу захуячить клиент десктопный для вбыдлятни через API. OpenSSL и Sockets типа использовать, хочу опробовать boost.asio. Взлетит?
>>469822
Откуда такой бугурт? Ну далеко не программерская и не инженерная специальность. Тот парень, который спрашивал у меня за задачки, например, отлично шарит в английском и немецком языках. И ещё спортом занимается.
Да и годные лекции всегда годные, даже если какие-нибудь простые вещи рассказываю.
>Взлетит?
Из пушки по воробьям. Вот тебе пример использования апи, наговнокоженный за 15 минут в блокноте на жабаскрипте: https://ololoepepe.me/vktools/ Делать это все на крестах - тот еще изврат, вообще никакого смысла в этом нет.
>отлично шарит в английском и немецком языках. И ещё спортом занимается
Ну нихуя себе, умеет зубрить и прыгать на турничках. Прям мега достижения.
На этапе изучения языка очень важно понимать разницу между всеми существующими компиляторами. Есть более веские причины считать Лафоре плохим учебником?
>На этапе изучения языка очень важно понимать разницу между всеми существующими компиляторами.
Это байтоебство высшей пробы. В идеале ты вообще не должен думать о компиляторе, а руководствоваться только стандартом.
Ну так интереса ради, почему бы и нет? Ведь умение работать с сокетами и openSSL дохуя важный навык, нет?
Эта глава вроде нужна, чтобы рисовать в консоли, лол.
Лол нет, нормальный программист сделает что-то вроде Http.get("https://..."), а не будет пердолиться с сокетами.
А вдруг какой-нибудь сириус проект с сетевой йоблей? Я ведь в сторону C++ программирования двигаюсь.
Отчасти >>469857 прав, это все байтоебство, это скучно и ведет к написанию факториалов вместо программ.
>>469851
Маневр не удался.
>>469855
Да тут хуй поймет, даун на дауне сидит, еще и не такое могут сморозить.
>>469861
Ну короче сокет открываешь, коннектишься, данные передаешь/получаешь, закрываешь сокет. Сервер слушает на специальном сокете и создает новые сокеты при входящих соединениях, ты их в этот момент берешь и делаешь с ними все то же самое. Сокет можно рассматривать примерно как файл, только в файле у тебя произвольный доступ, а тут нет. Все, считай что почитал.
Блядь, что ж с этим C++ не так. Вроде бы, охуенный язык, но написать на нем ничего нельзя - проще на другом.
С чего это он охуенный, если он низкоуровневое устаревшее говно с тоннами костылей?
В этом посте я поясняю за научное байтоёбство, самый удобный и быстрый линал и охуительные библиотеки для научных вычислений. Но меня можно не слушать, потому что вся эта хуита для меня пока не окупилась.
Алсо, гейдев же.
>научное байтоёбство
>наука
>байтоебство
Выбери одно. Алсо, для науки матлаб и пистон.
>самый удобный и быстрый линал
>удобный
>С++
Ну-ну.
>охуительные библиотеки для научных вычислений
... для которых есть байндинги во всех популярных языках, и которые работают в этих языках с такой же скоростью, потому что сами то библиотеки на крестах.
>Алсо, гейдев же.
С этим согласен, тут альтернатив нет, только веселые фермы для браузеров на жабаскриптах.
> Ну вон смотри сколько кода на нем написано. Даже браузер, через который ты тут срешь, написан на этом божественном языке. Правда где бы мне работу найти.
Да, теперь открой исходники и проблюйся от убогой костыльной портянки.
>>469885
> Matlab и пиздон с scipy
Удобное средство для отработки прототипов, но если удаётся сделать что-нибудь годное, то лучше переписать на кресты, чтобы быстро работало и была возможность воткнуть где-нибудь ещё. редко, но бывает. У кода на матлабе/пиздоне всё есть проблемы с производительностью.
> Си
Кресты всё же удобнее, бенчмарков не проводил, ничего не скажу за проигрыш в скорости.
> Фортран
Убери это говно обратно в двадцатый век.
>бенчмарков не проводил, ничего не скажу за проигрыш в скорости.
Почти нет проигрыша. Если не использовать RTTI, например, то вообще разницы не заметишь.
>Убери это говно обратно в двадцатый век
С радостью бы, но это невозможно. Хотя кое-кто из знакомых берется за переписывание программ на фортране на плюсы и делает это годами.
Разве оно жабовские либы не через костыли использует? Говорю ж, особо не вникал, так, первые впечатления.
Те же яйца в профиль. Есть свои плюсы и своя клоунада (привет, StringBuilder). Все уродство - в жирнейших тырпрайз фреймворках типа спринга с XML-ной или аннотационной дрисней. Высший пилотаж по самую макушку в говне - сочетание первого со вторым.
Не сложнее. Алсо, перекатившись в жабу ты станешь владельцем самой крупной сети фабрик с фасадами и мостами.
Главное в предметной области что-то понимать.
Лол нет, абсолютно нативно использует, ведь компилируется в джявовский байткод.
Единственные противоречия могут быть в парадигме, ну т.е. джявовские классы все мутабельные, и будет некрасиво их мешать со скалой без обёртки.
>будет некрасиво их мешать со скалой без обёртки
Ну то есть фактически без костылей не обойтись, о чем я и говорю. Либо писать говнокод, а это и без скалы на жабе можно делать.
> противоречия в парадигме
Вот это меня всегда смущало, дикая помесь фп и ооп с кучей разных ништяков. Осилить сложно, обучать дорого.
Манямирок быдлокодера, оторванного от реалий рынка с дегенератами на рабочих местах во всех сферах, без исключения.
Он может и не быдлокодер, он наверняка даже круче большинства этих дегенератов, да и круче меня скорее всего, но от реалий и правда оторван. Таких даунов на работу берут, еще тупее чем студенты в этом треде.
Крайности, эти крайности, как же это заебало.
Лучше один раз написать костыль, чем всё время жрать говно. Для большинства задач тебе хватит одних скала-библиотек, тащемта.
Часто общаюсь с манагерами, они говорят, что задротских экспертов должно быть очень мало в отеделе. Лол, меня эти слова всегда успокаивали.
>In order to build and use ololord you will need the same libraries and tools as for every other project using Qt.
>Qt
Да ты же уёбок! Это поеботину на сервер тянуть только жуебок способен.
Спецы по машинному обучению и компьютерному зрению очень любят пиздон, хотя лаб, где используют SciPy, я тоже не видел.
Просто что машинное обучение, что компьютерное зрение - относительно молодые области, софт приходится пилить самим исследователям. В более старых отраслях рулят Фортран и C, ибо на них написаны все необходимые для работы вещи. Ну и еще есть R для статистических расчетов.
>>469936
>Часто общаюсь с манагерами, они говорят
Понятно. "Манагеров" забыли спросить.
Хуешинному хуечению, блядь. Я говорю о НАУКЕ - о молекулярной динамике, о методе конечных элементов, о различном Монте-Карловском моделировании, о прочих других алгоритмах с огромными разреженными матрицами - пистон никогда не будет использоваться в таких областях.
>Я говорю о НАУКЕ
Ебвть, о какой науке речь? В нормальной науке (читай: не в рашкинских говновузах "как отсрочить армию на 5 лет по N килорублей в год") как раз активно пользуют питон как glue между высокопроизводительными библиотеками, написанными на тех же фортранах и сях.
И делают это потому что в процессе проверки гипотезы пердолиться с итераторами, типами возвращаемых значений и прочей байтоебской херней в хуй не всралось.
Если гипотеза выстрелит, всегда найдется студент на кафедре, готовый за "отл" перехуярить все на чем-то быстром, а если не выстрелит, то не будет обидно за проебанные за байтоебством человекомесяцы.
Спасибо, посмеялся. Я вот про что: std::thread, например, выполняет переданную функцию однократно. Я не могу понять, пробуждение -- это когда я запускаю его снова или имеется в виду, что в нем будет жить цикл, который будет заставлять его выполнять работу по изменению std::condition_variable?
Поток это низкоуровневая хуйня. И он может уснуть (suspend) и проснуться (resume)
Поток засыпает, когда ты вызываешь у него sleep, wait у cond_var или любую другу функцию, которая что-то ожидает извне (ввод с консоли, чтение из БД, висение на сокете и т.п.).
Тогда поток засыпает. Когда, соответственно, заканчивается sleep, приходит уведомление от cond_var, совершается ожидаемое действие, поток просыпается и продолжает выполнять свою работу.
Понятно. А не реализует ли пересоздание потока через thread = std::thread( foo, arg1, arg2 ) тот же самый механизм? Id потока при этом не меняется.
Алсо, можно ли как-то передать переменную в уже работающий поток, не используя глобальные переменные?
> не используя глобальные переменные
Ну ты можешь в шаред память всё хуячить
Можешь сокет локальный создать
Пиздячить в стдин или открыть ещё пайк
Файл создать
>>469885
> ... для которых есть байндинги во всех популярных языках, и которые работают в этих языках с такой же скоростью, потому что сами то библиотеки на крестах.
Я аж сиранул от своей безоговорочной капитуляции. Хорошо, что на толчке сидел. Ну-ка, какая библиотека позволяет на кластере считать из твоего любимого языка, и на всех популярных языках?
Qt-мразь, ты вообще понимаешь, что ты некомпетентен вопиюще?
>>469924
> Я хотел бы писать программы, а не костыли для подстраивания библиотек одного языка под парадигмы другого.
Это ведь ты, да, ты, Qt-мразь? Ты понимаешь, что у тебя шизофрения? Ты понимаешь, что ты только что не хотел именно писать на Qt?
> как раз активно пользуют питон как glue между высокопроизводительными библиотеками, написанными на тех же фортранах и сях.
У нас дристоном только отсталая лаборатория пользуется, с даунами, там у чувака есть глава в диссере про веб-сервер на матлабе, а в научной новизне отправка почты после завершения расчёта. Плюсовые высокопроизводительные библиотеки под конечные элементы (e.g. libMesh) очень даже высокоуровнево конфигурируются без пердолинга, при этом можно спокойно считать нормальные нелинейные задачки, с которыми не справится помойка на этом самом дристоне.
> с которыми не справится помойка на этом самом дристоне.
Предвидя боль всяких детей, добавлю: помойка не справится в виду того, что плохо поддерживается MPI, с которым надо и на крестах-то пердолиться, а уж на дристоне я даже боюсь представить, как оно работает. Без MPI очень проблемно использовать больше 200 гигов оперативки, 8 ускорителей или 12 ядер (что относительно мало).
> больше 200 гигов оперативки, 8 ускорителей или 12 ядер (что относительно мало).
А потом ещё про джяву шутят
Описываемая конфигурация с крестами используется для тяжелых распределенных вычислений, а в джаве для круда. Правильно шутят.
Потоки операционной системы -- это достаточно низкоуровневая вещь. Поток может быть усыплен вообще в любой момент времени планировщиком операционной системы. На одноядерной машине так все время и происходит: каждому потоку выделяется квант времени, после чего он усыпляется и время дается другим потокам.
Поэтому пытаться разобраться в том, когда поток будет усыплен, а когда разбужен бесполезно.
Что касается пересоздания потока, ну просто в этом потоке сдвинется указатель на новопереданную функцию и все. Уснет ли он на этом моменте -- зависит от планировщика.
>можно ли как-то передать переменную в уже работающий поток, не используя глобальные переменные?
Можешь в поток передавать ссылку или указатель на переменную и менять её значение из другого потока, но эта переменная должна быть либо атомарная, либо ты должен защищать её мьютексом, иначе случится гонка данных и получишь неопределенное поведение.
Digia, иже еси на небеси!
Да святится имя Qt,
Да приидет царствие Qt,
Да будет воля Qt, яко на Linux и на Windows.
Либы насущные даждь нам днесь;
И остави нам сорцы наши,
Якоже и мы оставляем компиляторам нашим;
И не введи нас во искушение, но избави нас от GTK.
Фанатизм не нужен, как и нигилизм. Вообще на бордах характерно упарывание в крайности, либо говно, либо охуенно, и каждый нахваливает свою парашу. У всех инструментов свои плюсы и минусы, ну. Даже винапи в определенных ситуациях может пригодиться. Только конченые мудаки как тот порвавшийся безаргументный спермодебил начинают агр поповоду инструментов.
Ты опять вылезло? Аргументацию принес? Если нет, то уползай обратно.
>где ассемблер обгоняет icpc или даже просто реализацию на mkl
Проблема не в ассемблере, а в заебах компилятора и языка. Чтобы твой код обгонял ассемблерный, надо понимать почему, например, for ( int i=size(); i--; ) может компилироваться в более быстрый код, чем for ( int i = 0; i < size(); ++i ).
Тебе аргументацию дали, ты сделал КОКОКОКО, насемёнил и пошёл праздновать успех.
>насемёнил
Ну началось. Все кто не согласен с твоим кукареканием - семены. Давай разберем твои "аргументы", так и быть, заебал засирать тред.
>Кьют плох, как гуёвая библиотека.
Почему?
>Плюсы (как и любой другой язык без сборки мусора) не предназначены для написания гуёв.
Почему?
>Там нельзя естественным образом использовать современные гуёвые парадигмы
Какие именно парадигмы, почему нельзя?
>код пишется очень медленно
Примеры? Точные цифры? Сравнения с более быстрыми способами при равной сложности проекта и равной производительности?
>глючный
Примеры?
>IDE очень плохие
Критерий "плохости"? (Твои личные предпочтения не интересуют.)
>Кроссплатформенность достигается через еблю
Какую конкретно?
>тяжёлые либы
Тяжелые для каких устройств?
>глючит под виндой
В каких ситуациях? Примеры?
>макаки, которые не отличают друг от друга компиляторы
То есть ты утверждаешь, что разработчик гуёв должен знать все особенности каждого популярного компилятора? Для чего?
>Удел кьюта в качестве библиотеки — поддержка древнего легаси
Примеры использования кьюта в легаси.
>с ненавистью к своей потерянной жизни (т.е. для неудачников).
Переход на личности, не несущий никакой информации.
>Одна макака с решарпером заменяет целую группу кьютобезьян с тимлидом.
Примеры такой замены? Сравнение производительности труда? Конкретные компании и цифры?
>Есть библиотеки, которые не требуют анального кьюторабства
С оем же успехом можно сказать, что кьют не требует рабства этих самых библиотек.
>легко заводятся с разными компиляторами
Как и кьют.
>быстро изучаются
Как и кьют.
>и не навязывают свою парадигму программирования.
И требуют каждый раз вновь городить костыли и обертки, чтобы в итоге придти все к той же или похожей парадигме, потому что это удобно.
>Разонравилась библиотека? Выкинул из проекта за пару дней и заменил на конкурента.
Выкинул за пару дней, а потом два месяца прикручивал новую, с новыми костылями, потому что интерфейсы разные.
>Как и любая монструозная свалка кьют обречён на гниение и вымирание.
Что-то жаба не спешит умирать, хотя более монструозной свалки не найти.
Алсо.
>гуи
>гуи
>гуи
Если ты не знал, там еще много всего есть, хотя бы та же система локализации, сигналы-слоты без пердольства с калбэками и без портянки из шаблонов на 50 строк ради вызова одной функции. А также работа с сетью и хттп на достаточно высоком для байтоебского языка уровне, с поддержкой все тех же сигналов и слотов (попробуй на курле это сделать, например, заебешься костыли городить). Полный список модулей можешь посмотреть сам, но ты же скажешь что все это не нужно или тебе не нравится, как оно сделано, а аргументировать или привести примеры опять не сможешь, и продолжишь аутотренинг о том, что ты тут всех затралил своими высерами.
>насемёнил
Ну началось. Все кто не согласен с твоим кукареканием - семены. Давай разберем твои "аргументы", так и быть, заебал засирать тред.
>Кьют плох, как гуёвая библиотека.
Почему?
>Плюсы (как и любой другой язык без сборки мусора) не предназначены для написания гуёв.
Почему?
>Там нельзя естественным образом использовать современные гуёвые парадигмы
Какие именно парадигмы, почему нельзя?
>код пишется очень медленно
Примеры? Точные цифры? Сравнения с более быстрыми способами при равной сложности проекта и равной производительности?
>глючный
Примеры?
>IDE очень плохие
Критерий "плохости"? (Твои личные предпочтения не интересуют.)
>Кроссплатформенность достигается через еблю
Какую конкретно?
>тяжёлые либы
Тяжелые для каких устройств?
>глючит под виндой
В каких ситуациях? Примеры?
>макаки, которые не отличают друг от друга компиляторы
То есть ты утверждаешь, что разработчик гуёв должен знать все особенности каждого популярного компилятора? Для чего?
>Удел кьюта в качестве библиотеки — поддержка древнего легаси
Примеры использования кьюта в легаси.
>с ненавистью к своей потерянной жизни (т.е. для неудачников).
Переход на личности, не несущий никакой информации.
>Одна макака с решарпером заменяет целую группу кьютобезьян с тимлидом.
Примеры такой замены? Сравнение производительности труда? Конкретные компании и цифры?
>Есть библиотеки, которые не требуют анального кьюторабства
С оем же успехом можно сказать, что кьют не требует рабства этих самых библиотек.
>легко заводятся с разными компиляторами
Как и кьют.
>быстро изучаются
Как и кьют.
>и не навязывают свою парадигму программирования.
И требуют каждый раз вновь городить костыли и обертки, чтобы в итоге придти все к той же или похожей парадигме, потому что это удобно.
>Разонравилась библиотека? Выкинул из проекта за пару дней и заменил на конкурента.
Выкинул за пару дней, а потом два месяца прикручивал новую, с новыми костылями, потому что интерфейсы разные.
>Как и любая монструозная свалка кьют обречён на гниение и вымирание.
Что-то жаба не спешит умирать, хотя более монструозной свалки не найти.
Алсо.
>гуи
>гуи
>гуи
Если ты не знал, там еще много всего есть, хотя бы та же система локализации, сигналы-слоты без пердольства с калбэками и без портянки из шаблонов на 50 строк ради вызова одной функции. А также работа с сетью и хттп на достаточно высоком для байтоебского языка уровне, с поддержкой все тех же сигналов и слотов (попробуй на курле это сделать, например, заебешься костыли городить). Полный список модулей можешь посмотреть сам, но ты же скажешь что все это не нужно или тебе не нравится, как оно сделано, а аргументировать или привести примеры опять не сможешь, и продолжишь аутотренинг о том, что ты тут всех затралил своими высерами.
Решеточка, которая совсем недавно была прибита к венде гвоздями? В любом случае это не ц и не цпп .
Ничего не понял, что ты сказал. с какого перепугу твоя параша будет быстрее работать?
https://ideone.com/XMrfR2
Эта неочевидная ебуда работает точно столько же, а если убрать нагрузку, то будет работать медленнее. Не надо считать, что если в техникуме тебя научили писать на ассемблере, то ты от этого вдруг начнёшь обгонять компилятор. Я уже не говорю, что ты не знаешь про кеши, параллелизм и векторизацию, а только считаешь команды в наивной реализации компилятора. На дворе не 1975 год, пора отвыкать от байтоёбства.
>>470098
> Почему?
Причины приводятся дальше для текста.
> Почему?
Потому, что время жизни объектов в высокоинтерактивном приложении плохо контролируется программистом.
> Какие именно парадигмы, почему нельзя?
Не написать в одну строчку, не буду трудиться объяснять.
> Примеры? Точные цифры? Сравнения с более быстрыми способами при равной сложности проекта и равной производительности?
google://qt+vs+c#+programmer+performance
У меня по четвёртой ссылке кьют поливают говном, по второй ссылке кьют поливают говном. Вот тебе сравнения.
> Примеры?
Погугли хоть.
> Критерий "плохости"? (Твои личные предпочтения не интересуют.)
Плохой статический анализ (решарпер для плюсов с Qt работать не бдует), неразвитые методы рефакторинга. Пока хватит.
> В каких ситуациях? Примеры?
В гугле.
> То есть ты утверждаешь, что разработчик гуёв должен знать все особенности каждого популярного компилятора? Для чего?
Я утвержадю, что разработчик гуёв не должен быть Qt-хуесосом.
> Как и кьют.
Это не так; Qt требует дополнительного шага в компиляции, и часто не работает с нелюбимыми разработчиками компиляторами (пруфы в гугле)
> Как и кьют.
C++ — куда более сложный язык, чем шарп, поэтому и изучается дольше.
> Выкинул за пару дней, а потом два месяца прикручивал новую, с новыми костылями, потому что интерфейсы разные.
Не аргумент.
> Что-то жаба не спешит умирать, хотя более монструозной свалки не найти.
Ну и какие новые проекты на жабе? Она с Qt одной масти, только Qt даже хуже.
Заебало твою простыню читать, одна анальная боль некомпетентного Qt-неудачника.
Ничего не понял, что ты сказал. с какого перепугу твоя параша будет быстрее работать?
https://ideone.com/XMrfR2
Эта неочевидная ебуда работает точно столько же, а если убрать нагрузку, то будет работать медленнее. Не надо считать, что если в техникуме тебя научили писать на ассемблере, то ты от этого вдруг начнёшь обгонять компилятор. Я уже не говорю, что ты не знаешь про кеши, параллелизм и векторизацию, а только считаешь команды в наивной реализации компилятора. На дворе не 1975 год, пора отвыкать от байтоёбства.
>>470098
> Почему?
Причины приводятся дальше для текста.
> Почему?
Потому, что время жизни объектов в высокоинтерактивном приложении плохо контролируется программистом.
> Какие именно парадигмы, почему нельзя?
Не написать в одну строчку, не буду трудиться объяснять.
> Примеры? Точные цифры? Сравнения с более быстрыми способами при равной сложности проекта и равной производительности?
google://qt+vs+c#+programmer+performance
У меня по четвёртой ссылке кьют поливают говном, по второй ссылке кьют поливают говном. Вот тебе сравнения.
> Примеры?
Погугли хоть.
> Критерий "плохости"? (Твои личные предпочтения не интересуют.)
Плохой статический анализ (решарпер для плюсов с Qt работать не бдует), неразвитые методы рефакторинга. Пока хватит.
> В каких ситуациях? Примеры?
В гугле.
> То есть ты утверждаешь, что разработчик гуёв должен знать все особенности каждого популярного компилятора? Для чего?
Я утвержадю, что разработчик гуёв не должен быть Qt-хуесосом.
> Как и кьют.
Это не так; Qt требует дополнительного шага в компиляции, и часто не работает с нелюбимыми разработчиками компиляторами (пруфы в гугле)
> Как и кьют.
C++ — куда более сложный язык, чем шарп, поэтому и изучается дольше.
> Выкинул за пару дней, а потом два месяца прикручивал новую, с новыми костылями, потому что интерфейсы разные.
Не аргумент.
> Что-то жаба не спешит умирать, хотя более монструозной свалки не найти.
Ну и какие новые проекты на жабе? Она с Qt одной масти, только Qt даже хуже.
Заебало твою простыню читать, одна анальная боль некомпетентного Qt-неудачника.
>погугли
>погугли
>не аргумент
>погугли
>там сказали что это плохо
>сям сказали что это лучше
>погугли
>это не так
>погугли
Ну как и ожидалось.
> Ну как и ожидалось.
Ну что с тебя взять, если ты не погуглил даже перед тем, как высираться на доску?
>>глючит под виндой
>В каких ситуациях? Примеры?
Я не тот анон, что с тобой спорит, но у меня, например, есть одна проблема.
В QGraphicsScene есть 2 QGraphicsItem один из них - картинка, а другой - прямоугольник. Так вот, при изменении размера через стандартный setScale(), прямоугольник ИНОГДА съезжает с границ пикселей картинки. То есть увеличиваешь его - все норм, ровно по границам пикселей лежит, увеличишь еще пару раз - съезжает, увеличишь еще - нормально стоит на границе нужного пикселя. Причем я пробовал оба варианта дистрибуции opengl и не-opengl, ничего не менялось.
Тут только траллить друг друга умеют и лабы новичкам делать.
Код бы какой-нибудь дал хотя бы.
Да какой код, говорю же все стандартно, просто делаю setScale().
[code lang="cpp"]
// добавляю в сцену 2 простых итема
mImage = scene->addPixmap(pixmap);
scene->addItem(mSelectionFrame);
// По эвенту нажатия на кнопку увеличения масштаба или по колесу мыши происходит следующее:
mImage->setScale(mScale);
mSelectionFrame->setScale(mScale);
[/code]
помогите пожалуйста, не понимаю код
http://pastebin.com/GZRsUw38
привыполнении выводится 8, но я не понимаю что значит выражение n&1,
объясните пожалуйста что это такое
Тебе в /s тупой хуесос, там учат пользовать гуглом.
Зачем? Мы же возвращаем управление ДОСу.
>с какого перепугу твоя параша будет быстрее работать?
С такого, что size() может быть неконстантным методом класса, или в теле цикла будет вызов такого метода, и компилятор понаставит ненужных проверок, не говоря уже о пересчете size() на каждой итерации.
Это недостаточная байтоебля, ну. Зачем разбираться, как работает процессор, если можно написать for без третьего аргумента, как настоящий хакир?
Я так и делаю. Суть в том, что компилятор спотыкается даже на такой безобидной фигне, и если не проверяешь выхлоп компилятора, не понимаешь где он может протупить, то код на асме ты вряд ли обгонишь.
Пруфы были, что компилятор не спотыкается. И, да, от твоей байтоебли он _больше_ спотыкается и поэтому и нужно постоянно проверять. Это не твой уровень — так оптимизировать код, только если ты не пишешь высокопроизводительные библиотеки (что ты не делаешь судя по уровню владения темой)
Но ведь для того, чтобы понимать, что [вызов метода + операция сравнения] тяжелее, чем просто операция сравнения, вовсе не нужно знать ассемблер.
Конечно. Просто у некоторых есть безоглядная вера в то, что компилятор все оптимизирует, и разницы не будет.
Не знаю, спотыкается ли. Например, когда я делаю
for (unsigned int n = v.size(), i = 0; i < n; ++i)
fuck_your_mom(v, i);
я точно знаю, что я делаю: мне нужно зафиксировать размер вектор до цикла. Неважно, что там внутри цикла -- увеличит ли его размер ебля твоей мамаши, но итерации мне нужны с изначальным размером, и я точно полагаю, что не уменьшит.
Но когда я пару тредов назад спросил следующее: у меня есть (вместо звёздочек собачки т.к. иначе сожрётся) @@int_array_2D, я делаю внутри цикла switch (int_array_2D [ i ] [ j ] ) , и мне сказали, что отдельную переменную делать не надо, типа, здесь очевидно и так, что компилятор скопирует элемент массива в свитч.
Правильно сказали или нет?
> Конечно. Просто у некоторых есть безоглядная вера в то, что компилятор все оптимизирует, и разницы не будет.
Не путай незнание работы компилятора и байтоеблю. Не знаешь, как работает компилятор как раз ты. Вставить auto condition = size(); гораздо разумнее и понятнее, а работает быстрее.
Как я тебе посмотрю, размеры бинарников/экзешников сравню?
Даже если они разные, это ещё не значит, что код будет практически идентичен.
>Как я тебе посмотрю
Дебаггером. Плюс компиляторы умеют режим, когда для каждой строки исходника выводится получившийся асм.
Кодоны, есть один код.
<code>
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
int main()
{
\tsetlocale(LC_ALL, "Russian");
\tint number;
\tcout << setiosflags(ios::left);
\tcout.width(10);
\tcout << "Число";
\tcout.width(25);
\tcout << "Квадратный корень" << "Деление\n\n";
\tcout.setf(ios::fixed);
\tcout.precision(2);
\tfor (number = 1; number <= 10; number = number + 1)
\t{
\t\t
\t\tcout.width(10);
\t\tcout << number;
\t\tcout.width(25);
\t\tcout << sqrt(number) << static_cast<float> (number) / 2 << "\n";
\t}
\tsystem("pause");
}
</code>
Как можно реализовать деление number на number из предыдущей итерации с проверкой деления на "0", не городя параллельный цикл?
Кодоны, есть один код.
<code>
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
int main()
{
\tsetlocale(LC_ALL, "Russian");
\tint number;
\tcout << setiosflags(ios::left);
\tcout.width(10);
\tcout << "Число";
\tcout.width(25);
\tcout << "Квадратный корень" << "Деление\n\n";
\tcout.setf(ios::fixed);
\tcout.precision(2);
\tfor (number = 1; number <= 10; number = number + 1)
\t{
\t\t
\t\tcout.width(10);
\t\tcout << number;
\t\tcout.width(25);
\t\tcout << sqrt(number) << static_cast<float> (number) / 2 << "\n";
\t}
\tsystem("pause");
}
</code>
Как можно реализовать деление number на number из предыдущей итерации с проверкой деления на "0", не городя параллельный цикл?
СУКА ПИЗДЕЦ У НАС НА РАЙОНЕ ЗА ТАКИЕ ВОПРОСЫ УБИВАЮТ НАХУЙ.
Пиши [c ode lang="cpp"]/сюда свою парашу/[/code]
Пробел убери только.
>волнуют другие проблемы
>Пришел в священное место со своими устоями и правилами
>Выебывается.
Ты ведь понимаешь, что с таким подходом к решению проблем тебя пошлют нахуй вместе с твоими охуительными лабараторками?
Позволь людям жрать говно, раз они этого хотят. Зачем перед долбоебами распинаться?
его наследники BinaryTreeTextFileIO, BinaryTreeRedBlack, их назначения и набор функций не пересекается
идея создать инстанс сразу от двух последних шаблонов - это хорошая или плохая идея, и вообще реализуемая?
>BinaryTreeTextFileIO
>BinaryTree
>TextFileIO
Методы для работы с файлами приделаны к структуре данных, правильно понимаю? Это уже само по себе пиздец. Если ты еще и два таких класса в один объединишь, это совсем жопа с ручкой будет.
>Это уже само по себе пиздец
Ну почему? Может класс может ворочать деревьями на сотни гигабайт не загружая их полностью в оперативную память. Естественно такой класс должен уметь работать с ФС
Ну разве что так. Но все равно хуевый дизайн, смешивание двух разных сущностей.
BinaryTreeTextFileIO добавляет методы загрузки и сохранения дерева в файл
BinaryTreeRedBlack - добавляет функционал красно-черного дерева
в чем проблема методов работы с файлами в классе?
>>470401
хочется создать класс от 2х шаблонов сразу
что-то вроде class MyTree: public BinaryTreeRedBlack<int>, BinaryTreeTextFileIO<int>
или же сначала создать шаблон, наследующий от 2, а затем его инстанс, но это вопросы синтаксиса, а мне интересно, допустимо ли множественное ромбовидное наследование здесь, и насколько вообще допустима практика множественного наследования?
>в чем проблема методов работы с файлами в классе?
>хуевый дизайн, смешивание двух разных сущностей
>А также работа с сетью и хттп на достаточно высоком для байтоебского языка уровне
Я смотрю, неосилятор закукарекал. В чем конкретно неудобство send/recv/readv/writev?
>попробуй на курле это сделать
Что сделать? Я сейчас в таком прекрасном настроении, что готов макнуть тебя рожей в говно и хорошенько повозить.
Кстати, libcurl есть практически везде, а твой ебанутый libQtCore и libQtNetwork на сервер будет впердоливать только полный жуебок вроде тебя.
я так понял, что с помощью этого паттерна можно завести универсальное расширение свойств для многих различных классов, но я не понимаю как решить мою проблему в общем случае: пусть есть базовый шаблон(класс), от него наследуют другие шаблоны(классы), каждый расширяет функционал предка так, что попарно они не пересекаются, хочется свободно и гибко наследовать сразу от нескольких шаблонов (иметь любую комбинацию расширений функционала начального предка).
Ты описываешь Mixin, CRTP позволяет реализовать эту штуку, вот ссылка на хабропарашу:
http://habrahabr.ru/post/210894/
Это все равно верх тупизма, особенно если учесть, что ОС и так вызовет memory map, как только память процесса превысит лимит.
Тогда ты очень неправильно понимаешь ООП.
Очень долго взлетал и был неюзабелен, а сейчас уже не взлетит, потому что есть более вменяемые альтернативы в виде новых плюсов, го и раста.
Го не замена крестам, от синтаксиса раста можно вырвать глаза, а новые кресты такое же многословное уебанство.
Я бы писал на d, но сцуко не хватает гуя и идешки.
>Го не замена крестам
Но он занимает нишу нативного языка со сборкой мусора. Плюс он уже очень популярен.
>от синтаксиса раста можно вырвать глаза
Зато там безопасность работы с памятью обеспечивается на уровне типов. Он занимает байтоебскую нишу.
>а новые кресты такое же многословное уебанство
Но они гораздо более юзабельные, чем предыдущие, и у них куча библиотек и тулзов.
В итоге для ди просто не остается места. Он бы выжил, если бы на нем был бы популярный проект, или его проталкивала жирная корпорация, но этого нет.
Выкинуть нахуй эту лабу и съебать из треда.
Например завести переменную prevNumber и делить на неё или делить на number - 1
Тогда думать и самому решать подобные задачи, иначе даже говнокодера из тебя не получится.
Ну этим я себя в тупик и загоняю.
> Это все равно верх тупизма, особенно если учесть, что ОС и так вызовет memory map, как только память процесса превысит лимит.
Вопиющее незнание вопроса. Подкачка (про которую ты вспомнил), memory map и напердоленная вручную буферизация это обычно три совершенно разных скорости работы (а если кончается оперативная память, то это обычно либо ошибка в программе, либо в днк, либо высокопроизводительное приложение).
Не исключаю. Мне лень делать проект с библиотекой, если вход в библиотеку осуществляется нечасто, то разницы никакой точно нет. Если часто, надо делать замеры.
но тогда необходимо добавлять обертки подмешиваемых функций в базовый шаблон, а как сделать MixIn без изменения базового класса?
Если что, у меня здоро-о-о-овый бинарник, к которому статически линкуется mkl, cudart, какая-то параша для проверки персечений. А вот MPI линкуется динамически, и не тормозит, и линковать его статически почему-то не принято.
Так что я ставлю на то, что разницы особой нет. На шинде MPI не линкуется, бинарник не запускается, а его дёргает динамически шарп, но я перебдел, и вызовы в библиотеку ходят очень нечасто.
Про динамически залинковано я точно ошибся, там вообще весь пост несвязный, не знаю, почему я так написал.
то есть это - нехорошая идея?
template <class T> class BinaryTree
{
//
}
template <class T> class BinaryTreeRB: public virtual BinaryTree<T>
{
//
}
template <class T> class BinaryTreeFileIO : public virtual BinaryTree<T>
{
//
}
class myTree:public BinaryTreeAVL<int>::BinaryTreeAVL, public BinaryTreeFileIO<int>::BinaryTreeFileIO{};
> то есть это - нехорошая идея?
А зачем эта говнина вообще? Расплескивать интерфейс по куче малафьи. У тебя он такой большой, или надо постоянно подменять классы?
KISS
Почитай про шаблон ВИЗИТОР. С ним еще алксандреску пердолился (в modern c++ disign) можешь скачать книгу и почитать.
>это - нехорошая идея?
Хорошая в скале, но для С++ - не очень.
Правильнее сделать интерфейс
template <class T> ITree { ... = 0; };
Его реализацию
template <class T> BinaryTree : public ITree<T> { ... override; };
А в реализацию уже добавлять IO параметром шаблона, классом или миксином.
Если миксином, то можно так:
интерфейс
template <class T> ITreeIO { ... };
И реализация с CRTP:
template <class T, template <class> Base>
TreeTextIO : public ITreeIO {
Base self() { return (Base) this; };
...
}
соответственно, получаем
class TreeWithTextIO : public BinaryTree<int>, public TreeTextIO<int, TreeWithTextIO> { ... }
for ( auto obj : vec )
{
vec = new Obj();
}
После этого при обращении к объекту происходит сегафолт. Как выяснилось, объект не создается. В чем беда?
Да, понял. Благодарю. Глупая ошибка.
То есть, auto не понимает, что в векторе хранятся указатели?
auto то понимает, просто здесь та же фишка то и при передаче в функции по ссылкам и по значениям.
Есть объект, в нем вектор указателей. Нужна функция, которая выберет из вектора указатель и вернет, чтобы другая функция с ее помощью сошла с ним работать.
Ты какой-то ебанутый. Язык — лишь способ записи идеи. Нельзя выучить отдельно идею и запись идеи. Ты в своей путяги философию прогуливал?
Можно возвращать shared_ptr, и хранить его в контейнерах. Нихуя не понимаю, в чём проблема.
http://en.cppreference.com/w/cpp/memory/shared_ptr
get - returns a pointer to the managed object
Если не будет кольцевых зависимостей, то все будет прекрасно работать. Ты вообще читал мануал?
я даже не вошел в стадию прыщей.
Я уже разобрался.
Скажи, а насколько вообще стоит дрочить на умные указатели? В С++11-стайл они входят в обязательном порядке или сырой указатель в коде норм, если все удаляется как надо?
Зависит от задачи и личных предпочтений.
Виртуальное наследование и динамические касты - почти всегда признак плохой архитектуры.
>В итоге для ди просто не остается места. Он бы выжил, если бы на нем был бы популярный проект, или его проталкивала жирная корпорация, но этого нет.
Facebook Александреску кудах ко-ко-ко
Мимо проходил, отвечу. Я предпочитаю вилкой вычищать маллок и фри, когда дело идёт о серьёзных вычислениях. Когда игрушки играю для красивого кода, умные указатели.
Прочитал только десятый пункт, не узнал для себя ничего нового.
Для 1990 года неплохо.
НУ ТУПЫЕ да. Пердуляхи в своём мирке, не могут в новые идеи, вот и пердолятся как лохи.
Вот именно потому и не пишут, что >йоба-ооп .
Закон Мура не сумеет справиться с наплывом цпп-быдлокодеров в системное программирование.
true.
мы вон клепаем говнокод уже не первый год, однако это не мешает вполне успешно хуячить патенты на написанные говноништяки.
а код потом в продакшене поправят.
Самый логичный вариант -- notify_one при поступлении числа и глобальная переменная, в которой он хранится, пока его не возьмут на обработку. Но это как-то ебет инкапсуляцию во все дыры. Как это сделать грамотно?
Я не смог найти его реализацию под С++11. Можешь на пальцах хотя бы, как это через condition_variable сделать?
Скачай cpp concurrency in action, там должно быть
>Почему драйвера и ядра пишут на C
Потому что ООП для системного программирования абсолютно ненужно, а в С++ варианте - откровенно вредно.
Что за обертки у потоков? Если самописные просто добавь ему метод "обработать число" - поток получает число как аргумент, обрабатывает и засыпает. А основной поток постоянно просматривает дочерние потоки, находит спящие и дергает их за метод с следующим числом на обработку. Если обработка очень долгая можно добавить нотификации от дочерних потоков что они свободны и готовы получать новое число (чтобы главный не тормошил постоянно их, а ждал пока освободятся) - но это уже ебля, так как нотификации будут рассылатся из разных потоков ну и пиздец.
Обертки — объекты, в которых хранится поток, его флаги и функции для работы с ним. В принципе, оно и так нормально работает, но думал сделать на CV, чтобы все в конторе, куда делаю тестовое, охуели, как я могу.
В итоге решил забить, потому что мороки много, а программу это лучше не делает — наоборот, вместо lock-free механизма, который выглядит легко и работает быстро, получается мутотня с мьютексами и страшный код.
Послал в полночь, завтра узнаю, насколько я крутой падаван многопоточного программирования.
[code]
struct GUIStorageObject
{
virtual ~GUIStorageObject() = default;
};
template<class T>
struct GUIStorage : GUIStorageObject
{
void setValue(T value) {m_value = value;}
T value() const {return m_value;}
private:
T m_value;
};
struct GUIElementObject
{
void AddLogic(GUIElementLogic logic);
template<class T>
void AddStorage() {m_storage.emplace_back(new GUIStorage<T>);}
template<class T>
GUIStorage<T>& Storage()
{
auto ptr = dynamic_cast<GUIStorage<T>>(m_storage.back().get());
CASSERT(ptr, "Wrong type for requested storage");
return *ptr;
}
private:
vector<unique_ptr<GUIStorageObject>> m_storage;
unique_ptr<GUIElementLogic> m_logic;
}
[/code]
потом я, вооружившись поинтером на GUIElementObject и номером стоража, внутри GUIElementLogic делаю вычисления(например привожу позицию слайдера к виду [0. .. 1.]) и далее могу получить результат из манагера GUIElementObject где угодно.
можно ли сделать это лучше?
[code]
struct GUIStorageObject
{
virtual ~GUIStorageObject() = default;
};
template<class T>
struct GUIStorage : GUIStorageObject
{
void setValue(T value) {m_value = value;}
T value() const {return m_value;}
private:
T m_value;
};
struct GUIElementObject
{
void AddLogic(GUIElementLogic logic);
template<class T>
void AddStorage() {m_storage.emplace_back(new GUIStorage<T>);}
template<class T>
GUIStorage<T>& Storage()
{
auto ptr = dynamic_cast<GUIStorage<T>>(m_storage.back().get());
CASSERT(ptr, "Wrong type for requested storage");
return *ptr;
}
private:
vector<unique_ptr<GUIStorageObject>> m_storage;
unique_ptr<GUIElementLogic> m_logic;
}
[/code]
потом я, вооружившись поинтером на GUIElementObject и номером стоража, внутри GUIElementLogic делаю вычисления(например привожу позицию слайдера к виду [0. .. 1.]) и далее могу получить результат из манагера GUIElementObject где угодно.
можно ли сделать это лучше?
>virtual ~GUIStorageObject() = default;
Что значит = default? Это какая-то хуйня из С++11/14?
Если единственное что тебя останавливает это ебучий паскаль то можно.
{}
Лучше имплементировать через MVC/MVVM.
[code lang="cpp"]
template< typename EventType, typename ... Args >
std::shared_ptr< EventType > make_event_0 (Args &&... args)
{
\tauto result = std::make_shared< EventType > (std::forward< Args > (args)...);
\treturn result;
}
template< typename EventType, typename ... Args >
std::shared_ptr< EventType > make_event_1 (Args &&... args)
{
\treturn std::make_shared< EventType > (std::forward< Args > (args)...);
}
[/code]
На всяких stackoverflow и маерсах написано, что нужно юзать 1-й вариант, мол во 2-м шаред сразу разрушается. Только что проверил - оба возвращенные значения имеют по 1 strong ref
Это маерсы со стеком пиздят, или это спермотанцы в компиляторе?
Алсо, про rvo знаю, но маерс вроде бы хуйни не скажет. Компилятор, как видно из поста, msvc
Вообще, по логике вещей, эти штуки должны компилироваться в один и тот же код. Поэтому если не собираешься в кроссплатформенность, то не парься на этот счет вообще.
Но вообще сейчас проверю на gcc.
В обоих случаях внутри функции происходит создание экземпляра shared_ptr, после чего при выходе из функции создается еще один экземпляр (который и является возвращаемым значением), а экземпляр внутри функции удаляется. Никакой разницы с точки зрения последовательности событий нет.
Иногда это можно поправить наследованием, но когда классы друг с другом вообще плохо связаны, но один должен в некоторой ситуации покрутить в другом?
Например, enable_shared_from_this хранит weak_ptr, который при захвате объекта должен быть инициализирован в конструкторе shared_ptr. Я не понимаю, как тут избавиться от друзей, и не знаю, нормально это или нет.
Не вдаваясь в подробности, в моем случае все тоже можно решить наследованием, однако хотелось бы все же услышать авторитетное мнение про общий случай.
Абсолютно нормально. В С++ кривой механизм инкапсуляции, и friend используется как костыль для замены нормальной модульности.
От друзей избавляются делая публичный интерфейс таким чтобы обьявлять друга не надо было.
>Чем кривой, как не криво?
Тем что инкапсуляция ограничена классом, а не модулем. С модулями можно было бы указать, что вот эти классы в одном модуле, и имеют доступ к приватным полям друг друга.
Кстати, для визуализации данные есть d3.js, может ему все-таки в анализ данных податься, если бэкграунд такой хорош, как он описывает.
this->init();
this->onCreate();
То есть, я хочу вызвать метод onCreate после инициализации класса, которая обязательно будет в функции init. Компилятор ругается на unresolved reference. По 1 на каждый подкласс. Если я определяю init как virtual void init(){}, то всё компилируется, но функции в подклассах не вызываются.
Пикрандом.
Никак. Сначала вызывается конструктор базового класса, а только потом - наследника. В базовом классе у тебя метод чисто виртуальный, поэтому и обратиться не к чему.
Может есть какие паттерны? Я просто хочу вызывать метод onCreate после того, как инициализирую класс-наследник.
Дружественная фабричная функция, создающая объект, вызывающая onCreate и затем возвращающая объект, не?
[code lang="c++"]
Base create(Type t)
{
Base o = 0;
switch (t) {
case Derived1Type:
o = new Derived1;
break;
//...
default:
break;
}
if (o)
o->onCreate();
return o;
}
[/code]
А можешь объяснить, зачем оно тебе вообще надо? Я с ходу не могу вообще представить ситуацию, где конструктор Derived должен работать не по принципу "конструктор Base + еще что-то", более того, это противоречит абстракции.
Всё вам объяснять, блядь. Я же написал. Хочу вызывать метод onCreate после инициализации класса. Инициализация у каждого класса своя, а onCreate - общий метод.
И так для каждого Derived-класса? Может есть что-то более компактное?
Но ведь это не ответ на вопрос. Зачем тебе надо вызывать какой-то метод после создания каждого объекта такого класса?
И зачем, к слову, его делать методом класса, а не просто void onCreate( Base @base )?
Конструктор Base-класса должен делать немного своих дел, потом вызывать инициализатор Derived-класса, а потом вызывать свой метод onCreate.
NioController(T object, std::string fileName) {
this->mObject = object;
this->initLua(fileName);
this->init(); // вот эта функция и есть виртуальная
this->onCreate();
};
В init делаются все нужные биндинги для lua, которые нужны определённому Derived-классу. Для каждого биндинги свои. Метод onCreate вызывает lua-функцию onCreate. Вызов этой функции для каждого Derived-класса одинаковый.
Тогда придётся добавлять в неё все новые Derived-классы. А я хочу, чтобы такого не было.
Пошёл-ка ты нахуй. Я спросил, как можно реализовать костыль для моей архитектуры. Объяснять мне, какой я мудак и как неправильно делаю я не просил.
Реализуй так, чтобы не понадобилось.
Вообще, приведи, наконец, конкретный пример, чего тебе хочется реализовать. Расскажем тебе, как это сделать не через жопу.
Кокой агрессивный петушок. Хуй тебе помогут, чепушило.
возможно ли в конструкторе по условию отказаться от создания экземпляра и выплюнуть NULL или всегда нужна обертка?
я понял про NULL_OBJECT, но если очень хочется, чтобы к памяти не было запросов
Скорее всего, вопрошающий дрочит на скорость и исключениями пользоваться не хочет.
>>471891
Ну хуй знает даже.
На всякий случай:
http://www.parashift.com/c++-faq-lite/ctors-can-throw.html
если что, мой текущий рекорд - 1,5 эякуляции за время компиляции
> Скорее всего, вопрошающий дрочит на скорость и исключениями пользоваться не хочет.
А тип вылет к хуям от нуллпоинтера это норм? Охуеть вообще
ПРО СИ++, ЦИТИРУЮ СЕБЯ ПО ПАМЯТИ:
про С++ (цитирую себя по памяти)
Деструкторы не использовать
Виртуальные методы только как реализвции интерфейсов
Вместо не виртуальных методов - статические методы
Вместо конструкторов - статические методы
каталог-кун
> статические методы
тоже предпочитаю так делать
> Вместо не виртуальных методов - статические методы
Это что ещё за хуита такая?
я вижу в твоих словах много рекурсии, но мало здравого смысла.
оно джавапредатель, пари держу
ИЛЛЮСТАЦИЮ ЗАБЫЛ
ПРОБЛЕМА С++ В ТОМ ЧТО ТУПОЙ ПРЕПОД СТРАУСТРУП В СВОИХ КНИЖКАХ НАСАЖДАЕТ В ГОЛОВЫ НЕПОТНЫХ ЛОХОВ ИДЕАЛЫ ООП КОТОРЫМ ПРЕДСТОИТ БЫСТРО РАЗБИТСЯ О СПЛОШ КОМПРОМИСНУЮ РЕАЛИЗАЦИЮ
У ДЖАВАМАКАК ИДЕАЛЫ ООП РАЗРУШАЮТСЯ НАМНОГО ПОЗНЕЕ КОГДА СБОРЩИК МУСОРА НАЧНЕТ ВЕШАТЬ СИСТЕМУ НА НЕСКОЛЬКО МИНУТ
QString qstr;
bool *ok;
int res=qstr.toInt(ok);//ошибка
//
bool ok;
int res=qstr.toInt(&ok);//все нормалек
class A
{
//
A GetShit();
};
class B: public virtualB
{
//
}
int main
{
B ptrB=new B;
B C;
C=B->GetShit();//здесь возвращается дерьмо типа базового класса
//а мне нужно дерьмо производного
//как изменить метод, чтобы его не требовалось переопределять в любом производном классе?
//в голову приходит только void GetShit();
Модель всегда наследник одного и того же класса, представление -- тоже.
Никак. Просто изменяй его в любом производном. Может быть, можно просто написать = delete в 11-х Сях, не знаю.
А в чем проблема? Обычное же MVC - у вью метод который принимает модель и изменяет вью соответсвенно модели, контролер в нужные моменты скармливает вью нужные модели, вью изменяется.
ебать, ну я и мудак
class MyShit: public B<int>
{
};
int main()
{
MyShit test();
}
template <class T> A<T>
{private:
T Value;
protected:
T GetValue(){return this->Value;}
public:
A(T value){this->Value=value;}
};
template <class T> B<T>:public virtual A<T>
{ private:
struct C
{
QString key;
//other shit
};
C TransmuteThisIntoC();
public:
A<C>* SomeShit()
{
return new A<C>(TransmuteThisIntoC());
}//здесь первый наебок
//in instantiation of class A<B<int>::C>
//required from class B<int>
//required from class MyShit
//A<T> has incomplete type
};
//второй наебок с любым вызовом GetValue<C>()
//member function T GetValue() is declared as protected
//то есть экземпляр класса A<C> не видит свой собственный метод
throw PR_SOLVES_MY_PROBLEM();
class MyShit: public B<int>
{
};
int main()
{
MyShit test();
}
template <class T> A<T>
{private:
T Value;
protected:
T GetValue(){return this->Value;}
public:
A(T value){this->Value=value;}
};
template <class T> B<T>:public virtual A<T>
{ private:
struct C
{
QString key;
//other shit
};
C TransmuteThisIntoC();
public:
A<C>* SomeShit()
{
return new A<C>(TransmuteThisIntoC());
}//здесь первый наебок
//in instantiation of class A<B<int>::C>
//required from class B<int>
//required from class MyShit
//A<T> has incomplete type
};
//второй наебок с любым вызовом GetValue<C>()
//member function T GetValue() is declared as protected
//то есть экземпляр класса A<C> не видит свой собственный метод
throw PR_SOLVES_MY_PROBLEM();
коротко: как внутри шаблона-потомка инстанцировать шаблон-предок структурой, декларированной приватной в шаблоне-потомке?
Использовать protected.
Это копия, сохраненная 1 июня 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.