Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
#define constructor
…
constructor var () {
Я понимаю, что этим даже «отцы-основатели» баловались (хорошо известный пример из оригинального Bourne Shell'а):#define BEGIN {
#define END }
#define SWITCH switch(
#define IN ){
#define ENDSW }
#define FOR for(
#define WHILE while(
#define DO ){
#define OD ;}
#define REP do{
#define PER }while(
#define DONE );
#define LOOP for(;;){
#define POOL }Но в современном мире такие вещи вытворять не принято. И уж тем более не принято разносить реализацию одного класса по разным файлам с помощью #include (иногда приходится, да, но обычно всё-так стараются так не делать). Да и вообще количество WTFов при чтении этого творения зашкаливает.strdout — это ведь такой идеоматичный C++, правда?wchar_t, а двухбайтовый char16_t, где не изобретается без нужды велосипед (что заодно позволяет не порождать ошибок вида if (size < size) return -1; ), где грамотно используется const и права доступа (что будет со всеми вашими построениями, когда кто-то в ваши структуры ручками залезет и там всё испортит?). jslike::var a;
std::string b;
хочется-таки писать a = b;
а неa = static_cast<char *>(b.c_str());
c_str и static_castы?operator + не через operator += реализован? В результате если у вас есть jslike::var a = 2;
jslike::var b = "test";
то a += b;
даёт undefined притом что a = a + b;
даёт 2test что, как по мне, ну… несколько странно.Признаком C++ является вменяемый код, в первую очередь.А невменяемый код тогда на чём написан? ))
В конце-концов всё, что вы тут наворотили — это синтаксический сахар, а зачем он нужен, если при его использования у меня изо всех щелей будут лезть c_str и static_castы?
А невменяемый код тогда на чём написан? ))А это уже криминалист нужен. Хорошо известно, что целеустремлённый Настоящий Программист может писать фортрановские программы на любом языке, но отсюда не следует, что всё, что не написано на C++ написано на фортране.
using namespace std;
class var{
//...
friend ostream& operator<<(ostream&, const var&);
//...
}
ostream& operator<<(ostream& out, const var& value){
out<<value.something;
return out;
}
//...
var v;
cout<<"My var:"<<v<<endl;
<code class="cpp">
var s1 = new char[10]; // Здравствуйте, утечки памяти
char a[2] = {'a','b'};
var s2 = a; // Здравствуй, "харт блидинг"
</code><pre>
лишь бы не компилировать boost
// Утечка памяти, виноват std::string!!!1
std::string heap_garbage(new char[10]);
char a[2] = {'a', 'b'};
// Читаем стек до первого нуля, виноват std::string!!!1
std::string stack_garbage(a);
char * никуда не копируются. Так что без new вы туда char[10] передать не сможете. А вот new char[10] передать можно — но тогда да, память начнёт утекать.без new вы туда char[10] передать не сможете
И вообще ваш var, это union, tagged union, нет смысла в layout'е выделять память под все возможные хранимые типы.Угу. И специально для этого в C++ можно описывать
union'ы без имени. В версии на gihub'е это есть. Конечно это «чудесный» union с двумя полями — один int, другой data (а дальше — куча cast'ов), что, конечно, тоже непорядок (лучше было бы перечислить все типы с которыми реально происходит работа).
Maximum overload — приключения в JavaScript в мире С++