Задать вопрос
  • Как лучше (проще и красивее) реализовать произведение комплексных и действительных чисел?

    Нужно понимать, что не существует операций между комплексными и действительными числами в математике. Действительные числа неявно приводятся к комплексным, и операции уже выполняются над комплексными числами.
    C++ позволяет вам так делать, достаточно определить конструктор с 1 параметром.

    Complex(double _r): Complex(_r, 0){}

    Теперь любые числовые литералы и типы, которые могут быть неявно приведены к double, так же могут быть неявно приведены к Complex. Теперь можно писать следующее:
    Complex(1,2) + 1;

    Остаётся другая проблема. Операторы объявлены как функции-члены, что позволяет их использовать лишь тогда, когда левый операнд - комплексное число. Такое выражение не скомпилируется:
    1 + Complex(1,2)

    Что бы обойти эту проблему, нужно заменить функцию-член на дружественную функцию:

    #include <iostream>
    using namespace std;
    
    class Complex {
    	public:
    		Complex(double _r, double _i): r(_r), i(_i){}
    		Complex(double _r): Complex(_r, 0){}
    		
    		friend Complex operator + (const Complex &left, const Complex &right);
    
    	private:
    		double r,i;
    };
    
    Complex operator + (const Complex &left, const Complex &right) { //Friend function
    	return Complex(left.r + right.r, left.i + right.i);
    }
    
    int main() {
    	Complex a = 4;
    	Complex b(1,2);
    	int c = 5;
    	a+b;       // OK
    	3+b;       // OK
    	a+123.0f;  // OK
    	c+a;       // OK
    	return 0;
    }
    Ответ написан
    5 комментариев
  • С чего начать в изучении ssh?

    NullByte
    @NullByte
    Bad gateway
    user@linux: #> sudo apt-get install ssh tmux
    user@linux: #> sudo service ssh start (запуск сервера)
    user@linux: #> ssh user@localhost
    Login: user
    Password: (ввод вслепую, не думайте что "ничего не набирается")
    Welcome to Linux at localhostname
    blablabla
    user@linux: #> (с этого момента все идет через ssh-подключение, а не через обычный терминал)
    user@linux: #> tmux ( запускает виртуальный терминал, интересная и полезная вещь, если собираетесь активно работать через удаленку, читайте мануалы по его использованию, возможностей там много)
    вот и все. еще изучайте стандартные команды линуксов.
    Ответ написан
    Комментировать
  • Как отличить полиморфизм в языках программирования?

    @MiiNiPaa
    Вам нужно хорошую книжку. Это одно из базовых понятий и вряд ли вы изучите этот вопрос на Тостере.

    Начнём с того, что основная идея полиморфизма — одинаково работать со множеством типов.

    Типов полиморфизма много, начиная с самого простого — параметрического полиморфизма, aka перегрузка функций. В Питоне, например, можно написать print x, и получить этот икс на экране. Причём получим разный результат в зависимости от конкретного типа x. В С++ можно писать cout << x, можно писать abs(x), и выполнятся будут разные действия в зависимости от x. В С, к примеру, пришлось бы самому выбирать какую функцию вызвать: abd, fabs, labs... так как в С нет перегрузки функций.

    Динамический полиморфизм работает похожим образом: представьте себе алгоритм, который должен рассчитать общую сумму задолженности. У человека могут быть займы займы разных видов, которые считаются по-разному. Вместо того, чтобы прописывать явный алгоритм действий для каждого типа займов, алгоритм работает с абстрактным типом займов, для которого определена функция Займ.ПосчитатьДолгНаДату(Дата). Конкретный алгоритм расчёта зашит в конкретный тип-потомок Займа, алгоритм лишь спрашивает какая задолженность будет на конкретную дату, и его не колышет какой на самом деле это займ.
    Ответ написан
    1 комментарий
  • Как отличить полиморфизм в языках программирования?

    maaGames
    @maaGames
    Погроммирую программы
    А вот не нужно смотреть презентации, надо читать книжку, хотя бы для чайников. Нельзя про С++ смотреть видосики, надо читать. Без этого никак. Тогда часть вопросов отпадёт, ещё больше вопросов появится...
    Ответ написан
    Комментировать
  • Как изменять значения переменных другого класса в C++?

    @Alexander1705
    Первое:
    Если пишите на C++ и используете заголовочные файлы С, их принято называть ctime, а не time.h

    Второе:
    Для псевдослучайных чисел в C++ используйте заголовочный файл random:
    #include <random>
    ...
    std::random_device rd;
    std::cout << rd() % 10;


    Третье:
    Если вам нужен массив, используйте массив. То что вы написали - очень странный костыль.
    Если нужно заполнить массив случайными числами, напишите функцию:
    void fill_with_random(int* arr, size_t n)
    {
        random_device rand;
        for (size_t i = 0; i < n; ++i)
        {
            arr[i] = rand() % 21 - 10; 
        }
    }


    Четвёртое:
    cout << y[0][0]; //все прекрасно выводится
    /*но если попробовать сделать y[0][0]+=1; то выводится ошибка "выражение должно быть допустимым для изменения левосторонним значением"*/

    Естественно, так происходит потому, что в вашем классе (который и не нужен совсем) вы возвращаете число, там где ожидается ссылка:
    int operator [](int i)
    {
        return x[i];
    }

    Заменить на:
    int& operator [](int i)
    {
        return x[i];
    }


    Пятое:
    int  operator [](int i)
    {
        return y[i][0]; /*совершенно непонятно, какую роль здесь играет [0], и почему не работает с просто return y[i]... при изменении [0] на любое другое число, результат не меняется...*/
    }

    Непонятно потому, что его там и не должно быть. operator[] должен давать доступ к строке (т.е. массиву). А уже второй operator[] будет относится к массиву и возвратит ссылку на элемент.
    massiv& operator [](int i)
    {
        return y[i];
    }


    Шестое:
    Если нужна матрица, используйте двумерный массив и не изобретайте велосипед. Если класс всё же необходим, например, если нужно добавить методы для работы с матрицей, можно написать такой класс, используя двумерный массив:
    class Matrix
    {
    public:
        Matrix() {}
        int* operator[] (size_t i)
        {
            return &arr[i][0]; // Указатель на первый элемент i-ой строки.
        }
    private:
        int arr[5][5];
    }


    Седьмое:
    Классы принято называть с большой буквы. И пожалуйста, не называйте их транслитом.
    Массив - Array
    Матрица - Matrix
    Ответ написан
    Комментировать
  • Почему не работает оператор сравнения?

    dnovikoff
    @dnovikoff
    У вас не инициализируется члены класса в конструкторе. Нужно

    Points:Points():x(0), y(0) {
    }

    Points:Points(int x, int y):x(x), y(y) {
    }
    Ответ написан
    1 комментарий
  • Нужен ли Win32\ WinRT?

    @VZVZ
    Reverse-Engineer, Software Developer, Architect
    Под WinRT (Metro/UWP) пока рановато писать, хотя бы потому, что мала популярность виндов 8 и выше, а на ниже его нет вообще.

    Нужно писать классические десктопные приложения, которые идут хотя бы на WinXP и выше.
    WinRT не является для них основой, он прилеплен где-то сбоку как другая платформа.
    А вот Win32 - является, все фреймворки (.NET, VCL, Qt...) основаны на WinAPI.

    Но непосредственно на WinAPI никто не пишет приложений, это слишком тяжело и долго, основную часть кода пишут на фреймворке (под винду обычно лучше всего C# и .NET), а вот те вещи, которые на фреймворке не сделать, - делают на WinAPI.
    Поэтому полезно изучать WinAPI, но реально нужнее знать именно те его функции, для которых нет оберток в фреймворке. И изучать их по мере необходимости: писал программу - понадобилась - погуглил - изучил - вставил DllImport - применил - работает.
    Хотя и тот же GUI или работу с файлами или HTTP тоже полезно изучать параллельно на .NET и на WinAPI, для знания основ, ваш вопрос "кто на ком основан" это тоже поможет прояснить.
    Ответ написан
    1 комментарий
  • Qt Widgets как закрасить только один виджет?

    @1q2w1q2w Автор вопроса
    sudo make install
    Блинскиный) как обычно все банально) забыл вызвать метод update() :)
    bool Widget::eventFilter(QObject *object, QEvent *event)
    {
        if (event->type() == QEvent::FocusOut)
        {
            if (object == this)
            {
                qDebug() << "Здесь ловим событие focus Out!";
                this->isActive = false;
                this->update();    // из-за этой строчки я потерял 1,5 часа)
            }
        }
        return false;
    }

    А все потому, что думал, будто paintEvent и так вызывается по 100 раз в секунду, update() не нужен)) Ха .. нужен! Только через отладчик смог поймать ...
    Ответ написан
    2 комментария
  • Возможно ли применить такое условие?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    if (arr[0] == arr[1] == arr[2])

    Результат выполнения операции == в С++ -- это bool, а bool конвертируется в int.
    Запись в скобках эквивалентна (a[0] == a[1]) == a[2] и сравнивает a[2] с результатом сравнения a[0] и a[1] (0 если они не равны, 1 если равны). Т.е. 1 == 1 == 1 -- это истина, поскольку (1 == 1) -- истина, истина сконвертированная в int -- это 1, а 1 == 1 -- это истина.

    почему сравнение значений массива по индексу работает не так, как с обычными переменными

    Точно так же оно работает.

    как мне добиться нужного результата?

    if (arr[0] == arr[1] && arr[1] == arr[2])
    Ответ написан
    Комментировать
  • Как запустить программу не через командную строку?

    afishr
    @afishr
    make const not var
    Ну самое простое это создать WindowsFormApplication (Решения для Microsoft Visual Studio)
    Ну а в «промышленных» маштабах обычно используют фреймворк Qt
    Ответ написан
    Комментировать
  • Как в Visual Studio Community писать на С?

    @vilgeforce
    Раздолбай и программист
    Используете язык C++, но имя файла с исходником делаете не *.cpp, а *.c. Тогда он будет компилироваться как Си, а не как плюсы.
    Ответ написан
    5 комментариев
  • Для чего фигурные скобки после объявления переменной в C++?

    @SMA2
    Инициализация пустым значением.
    Это универсальное обозначение для различных типов переменных.
    В данном случае речь идет о целом числе, потому эквивалентно = 0
    Но фигурные скобки более общий метод, подходящий для переменных различных типов.

    То, что пример работает без инициализации - просто везение.
    Использование неинициализированной переменной - частая ошибка.
    Ответ написан
    1 комментарий
  • Как становятся программистами?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Не знаю. Меня укусил какой-то бородатый дядька, а дальше всё само пошло.
    Ответ написан
    2 комментария
  • Как воспроизвести аудио по ссылке (Windows, MacOSX)?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Qt поддерживает фокус:
    QMediaPlayer
    player = new QMediaPlayer;
    
    playlist = new QMediaPlaylist(player);
    playlist->addMedia(QUrl("http://example.com/myfile1.mp3"));
    playlist->addMedia(QUrl("http://example.com/myfile2.mp3"));
    // ...
    playlist->setCurrentIndex(1);
    player->play();
    Ответ написан
    3 комментария
  • Почему не отрабатывает перегруженный конструктор класса?

    @Mercury13
    Программист на «си с крестами» и не только
    Попробую рассказать об этом же более простыми словами.

    Текст String s3 = "Нас обманули, расходимся."; означает вот что. Мы создаёт временную строку «Нас обманули, расходимся», а затем присваиваем её нашему s3. Конечно, компилятор это потом заоптимизирует, но это семантика языка, и ей надо следовать.

    Есть два способа передать временный объект в функцию. Любую: хоть простую, хоть конструктор, хоть операцию =.
    Первый — константная ссылка: String(const String &S).
    Второй способ из C++11 — временная ссылка: String(String &&S).

    Из-за этих временных объектов конструктор копирования и операция «присвоить», по-хорошему, должны брать const-ссылку. Вот вам аналогичный пример с операцией «присвоить».

    class String
    {
    public:
        String() {}
        String& operator= (String& s) { return *this; }
    };
    String operator+ (String a, String b) { return String(); }
    
    int main()
    {
        String s1;
        String s2 = s1;
        String s4;
        s4 = s1 + s2;
    }


    Решается String& operator= (const String& s).
    Ответ написан
    Комментировать
  • Почему не отрабатывает перегруженный конструктор класса?

    @MiiNiPaa
    Потому что это copy-initialization. Чтобы она работала, нужен конструктор копирования который умеет принимать в качестве параметра временные обекты. (даже учитывая то что он не будут вызван благодаря copy-elision)

    Edit: en.cppreference.com/w/cpp/language/copy_initialization
    If T is a class type, and the type of other is different, or if T is non-class type, but the type of other is a class type, user-defined conversion sequences that can convert from the type of other to T (or to a type derived from T if T is a class type and a conversion function is available) are examined and the best one is selected through overload resolution. The result of the conversion, which is a prvalue temporary if a converting constructor was used, is then used to direct-initialize the object. The last step is usually optimized out and the result of the conversion is constructed directly in the memory allocated for the target object, but the appropriate constructor (move or copy) is required to be accessible even though it's not used.
    Грубо говоря сначала то, что справа неявно приводится к типу слева (при помощи конструктора) а потом используется для инициализации переменно с помощью move или copy-конструктора.
    Ответ написан
    Комментировать
  • Как считаете, правильно ли поступил преподаватель?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Забей. Главное - получить знания, и корочку. А иметь везде пятерки - не хватит нервов, всем преподам не угодишь.
    А препод поступил правильно. Он спросил - ты не смог, какие еще вопросы.
    Ответ написан
    Комментировать
  • Как считаете, правильно ли поступил преподаватель?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Все норм. В универах никто ни с кем не сюсюкается. Это не школа. Не знаешь - пшел вон.
    Ответ написан
    1 комментарий