LINUX.ORG.RU

Может кто нибудь показать красоту с++?

 ,


7

9

Может кто нибудь написать на c++, чтобы показать почему c++ лучше смотрится чем программа на си? Хотелось бы увидеть изящный код на c++, так, как это делают с хорошим опытом. Программу любую, главное чтобы было понятно, что c++ намного красивее в написании, чем си.

Ответ на: комментарий от tailgunner

Отличная антиреклама Си++. Средство обработки ошибок, оказывается, одна из самых опасных фич языка.

«Спички детям не игрушка» - является ли это антирекламой?
Инструментом сначала нужно научиться пользоваться.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Опасность забыть очистить память является ли антирекламой? Инструментом сначала нужно научиться пользоваться.

deep-purple ★★★★★
()
Ответ на: комментарий от linuhs_user

Это не map (т. е. двоичное дерево), а просто динамический массив. Тебе в любом случае придётся писать кучу кода. А если, допустим, попытаться реализовать вот такое:

#include <iostream>
#include <string>
#include <map>



using std::string;
using std::cout;
using std::endl;
using std::map;

class Base
  {
	public:
		virtual void fn() = 0;
  };

class A: public Base
  {
	public:
		virtual void fn() override { cout << "A" << endl; }
  } _a;

class B: public Base
  {
	public:
		virtual void fn() override { cout << "B" << endl; }
  } _b;

class C: public Base
  {
	public:
		virtual void fn() override { cout << "C" << endl; }
  } _c;

int main(int, char **argv)
  {
	map<string, Base *> fun(
	  {
		{"A", &_a},
		{"B", &_b},
		{"C", &_c}
	  });

	auto it = fun.find(argv[1]);
	if (it != fun.end()) it->second->fn();
	return 0;
  }

то код станет просто страшным. Разумеется, речь о полноценной реализации, а не об имитировании внешнего проявления

XMs ★★★★★
()
Ответ на: комментарий от deep-purple

один раз для void

Это единственный доступный вариант, но ценой типобезопасности на этапе компиляции. В итоге работу компилятора придётся выполнять программисту.


Каждому инструменту своя ниша

Разумеется, о чём я в конце первого поста и написал

XMs ★★★★★
()
Ответ на: комментарий от deep-purple

Exception-Safe Coding in C++

Опасность забыть очистить память является ли антирекламой?

Одно дело - забыть, второе - не знать.

Исключения выглядят просто. Поэтому никто даже не пытается погуглить про нюансы их использования. А на самом деле достаточно потратить всего лишь 3 часа своего времени на просмотр youtube'а: раз, два.

Kroz ★★★★★
()
Ответ на: комментарий от XMs

Отключи объектное мышление. Тут не будет «полноценной реализации», тут даже имитации не будет, а будет свой подход, который сделает в итоге то же самое, но другим путем.

deep-purple ★★★★★
()
Ответ на: комментарий от meliafaro

Зачем сравнивать высокоуровневую прикладную библиотеку со стандартным Си?

Как я уже писал, там я сравнивал именно интерфейсы и объём сопутствующего кода. Можно с чистой совестью сравнивать с STL, просто с точки зрения интерфейса я её не переношу и предпочитаю указывать на лучшие примеры

XMs ★★★★★
()
Ответ на: комментарий от Kroz

Отличная антиреклама Си++. Средство обработки ошибок, оказывается, одна из самых опасных фич языка.

«Спички детям не игрушка» - является ли это антирекламой?

Прекрасная аналогия. Такая релевантная.

Инструментом сначала нужно научиться пользоваться.

Конечно. Вот тоже инструмент, которым всего лишь надо уметь пользоваться: https://cdn.trendhunterstatic.com/thumbs/suicidal-revolvers-a-one-shot-weapon...

tailgunner ★★★★★
()
Ответ на: комментарий от XMs

По поводу конкретно этого примера. В структуре можно присвоить адрес ф-ции, которая знает что ей делать. Таким образом легко можно заоверрайдить fn(). Или добавить в структуру тип «объекта» и прогонять через единственную fn(), которая по типу объекта определит что сделать и кого подвызвать. Про мап мы уже обсудили.

deep-purple ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ты про логгер или про перехват/посыл? В любом случае, спорное утверждение. Тут просто разные подходы, т.к. разные инструменты.

deep-purple ★★★★★
()

C++ лучше любых других языков, потому что это самый быстрый язык в мире.

#include <numeric>
struct Rational
{
    int numerator = 0;
    int denominator = 1;

    constexpr Rational(int n, int d)
    :numerator(n)
    ,denominator(d)
    {}

    constexpr auto operator+(const Rational& rhs)
    {
        const auto lcm = std::lcm(denominator, rhs.denominator);
        const auto lhs_mult = lcm/denominator;
        const auto rhs_mult = lcm / rhs.denominator;
        return Rational(numerator*lhs_mult+rhs.numerator*rhs_mult, lcm);
    }
};

int main()
{
    auto result = Rational(1,2)+Rational(1,3)+Rational(1,4)+Rational(1,5);
    return result.denominator;
}

Вся эта простыня разворачивается в

main:
  mov eax, 60
  ret
Этим и крут С++

fsb4000 ★★★★★
()
Ответ на: комментарий от Kroz

Разбирался почему reverse2 работает. istream_iterator, оказывается, по умолчанию пропускает пробельные символы, то есть эта функция работает только с фиксированным набором разделителей и этот набор отличен от пробела.

red75prim ★★★
()
Ответ на: комментарий от pftBest

Оно дает правильный результат даже с выключенными оптимизациями:

-O0 Reduce compilation time and make debugging produce the expected results.

Но многие ошибочно считают, что это отключает оптимизацию.

tailgunner ★★★★★
()
Ответ на: комментарий от pftBest

с выключенными оптимизациями

$ gcc -Q -O0 --help=optimizers
$ gcc -Q -O3 --help=optimizers
EXL ★★★★★
()
Ответ на: комментарий от fsb4000

Этим и крут С++

Поправлю. Этим и крут gcc, начиная с версии 7.1. Да, и в конструкторе не помешало бы разделить делимое и делитель на их наибольший общий делитель, а иначе недолго до переполнения и UB.

red75prim ★★★
()
Последнее исправление: red75prim (всего исправлений: 3)
Ответ на: Case 2: Перегрузка операторов от Kroz

Пример 1: «плюс» означает конкатенацию массивов:

Кстати, в boost::assign есть еще переопределение которое позволяет делать что-то такое:

std::vector<int> numbers = {1, 2};
// ...
numbers += 3, 4, 5; // -> numbers = {1, 2, 3, 4, 5}

Пример 2: «плюс» означает сумму элементов массивов:

Уже есть. http://en.cppreference.com/w/cpp/numeric/valarray

KennyMinigun ★★★★★
()
Ответ на: комментарий от RazrFalcon

Это заслуга оптимизатора, а не языка.

Если б там не было constexpr — то да. А там явно языком (С++) написано «сделай мне вот то-то в compile-time» (aka constexpr).

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

А там явно языком (С++) написано «сделай мне вот то-то в compile-time» (aka constexpr).

Разве? «The constexpr specifier declares that it is possible to evaluate the value of the function or variable at compile time.» Это не обязывает действительно вычислять значения.

tailgunner ★★★★★
()

А std::lock_guard это тоже «колхоз»?

pftBest ★★★★
()
Ответ на: комментарий от red75prim

«The constexpr specifier declares that it is possible to evaluate the value of the function or variable at compile time.» Это не обязывает действительно вычислять значения.

Обязывает, если результат функции должен быть получен во время компиляции.

Это написано где-то в стандарте или пояснении к стандарту?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Инструментом сначала нужно научиться пользоваться.

Конечно. Вот тоже инструмент, которым всего лишь надо уметь пользоваться

Пятница...

Kroz ★★★★★
()
Ответ на: комментарий от RazrFalcon

А вот тут адок. Не нужно использовать убогий FILE.

Да согласен я. Просто подумал не взрывать сишнику голову файловыми потоками.

Kroz ★★★★★
()
Ответ на: комментарий от RazrFalcon

Как будто в расте не так. Там всюду итераторы. При этом более удобные.

Раст появился позже. Я уверен что он учел успехи и фейлы C++.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Да согласен я. Просто подумал не взрывать сишнику голову файловыми потоками.

Я кстати смотрел man std::istream std::ostream, но так и не понел как прочитать файл или строку с помощью c++. Можешь показать?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от EXL

Вот так там сделали

// where "//host" is a root-name
path("//host")  / "foo" // the result is      "//host/foo" (appends with separator)
path("//host/") / "foo" // the result is also "//host/foo" (appends without separator)
 
// On POSIX,
path("foo") / ""      // the result is "foo/" (appends)
path("foo") / "/bar"; // the result is "/bar" (replaces)
 
// On Windows,
path("foo") / "C:/bar";  // the result is "C:/bar" (replaces)
path("foo") / "C:";      // the result is "C:"     (replaces)
path("C:") / "";         // the result is "C:"     (appends, without separator)
path("C:foo") / "/bar";  // yields "C:/bar"        (removes relative path, then appends)
path("C:foo") / "C:bar"; // yields "C:foo/bar"     (appends, omitting p's root-name)

Silerus ★★★★
()
Ответ на: комментарий от red75prim

Разбирался почему reverse2 работает. istream_iterator, оказывается, по умолчанию пропускает пробельные символы, то есть эта функция работает только с фиксированным набором разделителей и этот набор отличен от пробела.

Поставленную задачу решает? Какие еще вопросы?
А для других задач - выбирай: http://www.martinbroadhurst.com/how-to-split-a-string-in-c.html

Kroz ★★★★★
()
Ответ на: комментарий от anonymous

add(a, b) ничем не отличается от a + b для 95% людей. И оно действительно не отличается.

А никто и не говорит что всегда имеет смысл перегружать операторы. Только там, где это даст профит. Например когда когда a+b-c*d . И операторы не ограничиваются математическими.

Kroz ★★★★★
()
Ответ на: комментарий от tailgunner

Скажем, пункт 10.2.7 стандарта С++17, указывает, что underlying type для enumeration c нефиксированным типом (unscoped enumerations имеют нефиксированный тип) не должен быть больше int, если значения элементов перечисления укладываются в int. Как это можно определить, не вычисляя constexpr function во время компиляции?

enum { Bar = constexpr_function() };

red75prim ★★★
()
Последнее исправление: red75prim (всего исправлений: 1)
Ответ на: комментарий от u0atgKIRznY5

Я кстати смотрел man std::istream std::ostream, но так и не понел как прочитать файл или строку с помощью c++. Можешь показать?

std::istream std::ostream - это базовые классы, от которых уже наследуются те классы, которые нужны.

Для чтения файлов используется fstream: http://www.cplusplus.com/reference/fstream/fstream/

Вот здесь пример (внизу, для записи): http://www.cplusplus.com/reference/fstream/fstream/open/

Kroz ★★★★★
()
Ответ на: комментарий от red75prim

Решает другую задачу. Табы и перевод строки обрабатываются не так в оригинальном коде.

Какую другую? Задача была именно по пробелам. Если была бы по \n или табам, я бы дал другое решение.
Если тебя интересует решение по \n или табам - смотри сюда: http://www.martinbroadhurst.com/how-to-split-a-string-in-c.html
Что не так?

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)

Тут нужна картинка. Примерно как на ней и выглядит красота C++ и проектов на нём. Ну а если чуть более серьезно, то C++ нужен не из-за красоты.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.