• Можно так сделать с interface?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    По уму, вам надо продумать ваш интерфейс. И тогда подобных извращений не понадобится. Дабавьте туда какой-нибудь способ для итерации по структуре данных для вывода. Или вообще сделайте метод ToString, который бы возвращал строковое представление внутренней структуры для вывода. Это все, естественно, виртуальные публичные методы, переопределенные в двух реализациях.

    То же и со вводом. Если надо как-то во внутренности очереди залезать и обычными push это не сделать, то, например, передавайте в метод CreateFromData() вектор введенных пользователем значений.
    Ответ написан
    Комментировать
  • Почему выдает ошибку при наследовании?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Для решения этой проблемы по уму надо написать вот это в определении производного класса:
    using Array<T>::_size;
    using Array<T>::_capasity;
    using Array<T>::_data;


    Ответ на вопрос "почему" в С++ всегда один: "потому что стандарт":
    Non-dependent names are looked up and bound at the point of template definition. This binding holds even if at the point of template instantiation there is a better match:


    Проблема в том, что Array зависит от T, а вот его член _size от T не зависит. Ну вот не ищет компилятор независимые имена в зависимых местах. Независимые имена разрешаются в месте определения шаблона, когда еще неясно даже, с каким оно типом будет работать-то. Поэтому он никак до Array достучатся не может, ведь никакого T конкретного у него еще нет.

    Надо как-то компилятору указать, где искать вот эти ваши _size и т.д.
    Например, через this-> или через using или через Array<T>::.

    Вообще от этих правил lookup-а в C++ волосы дыбом встают и куча приколов вылезает. Их надо только запомнить. Оно неинтуитивно, но таково оно есть.
    Ответ написан
    Комментировать
  • Вопрос про указатели. Правильно ли я понимаю?

    @dima20155
    you don't choose c++. It chooses you
    Вы немного путаетесь с указателями.
    int name1 = 42; // - локальная переменная типа int, хранится на стеке
    int* name2; // - локальная переменная типа указатель на int. Сама переменная (! не её значение) хранится на стеке. 
    int* name3 = &name1;  // - аналогично name2, Значение переменной указывает на переменную, которая хранится на стеке
    int* name4 = new int(84);  // - аналогично name3, Значение переменной указывает на переменную, которая хранится в куче.


    Аналогично и с векторами:
    vector<int> v1; // - хранит значения переменных
    vector<int*> v2; //- хранит указатели на переменные (которые не обязаны вообще быть чем-либо инициализированы, и могут находиться в любом из 4-ех типов типов памяти)
    vector<int>* v3; // - указатель на std::vector<int> (может находиться в любом типе памяти).
    vector<int*>* v4; // - комбинация v2 и v3.


    new vector<int>; Лишь выделяет память в куче и никак не связан с типами переменных. Вот пример
    int v5 = *new int(42);

    В данном случае будет выделено место в куче, затем (в общем случае) вызван конструктор. Созданная в куче переменная будет хранить 42. Затем мы создаем переменную v5 на стеке и копируем в неё (конструктор копирования в общем случае) значение переменной из кучи. Указатель же на переменную в куче будет потерян aka memory leak.
    Вот, кстати, примерчик.
    https://godbolt.org/z/eETGh3Whb

    Динамически выделить на стеке можно с помощью _malloca(size). Но, в общем, случае делать этого не стоит и это остается уделом тех, кто очень тонко хочет оптимизировать код. std::array принимает одним из параметров шаблона размер, соотвествнно в момент компиляции размер необходимого массива известен и его можно хранить на стеке (по сути это обертка над C-array, удобная и безопастная). Подозреваю, что в случае гиганских размеров std::array есть вероятность, что он может быть расположен в куче (подтверждений и опровержений этому не нашел!).

    P.S. Да, многовато вышло.
    Ответ написан
  • Вопрос про указатели. Правильно ли я понимаю?

    RabraBabr
    @RabraBabr
    У вектора из стандартной библиотеки, где бы он не был, буфер data всегда хранится в динамической памяти . SBO оптимизацию он не делает насколько я помню в отличие от бустовского. Сейчас меня поправят если я ошибся. Для размещения данных в стеке используйте std::array.
    Ответ написан
    2 комментария
  • Где взять math.h?

    Написал #include math.h

    А не пробовали, как надо писать:#include "math.h"?
    Ответ написан
    9 комментариев
  • Как реализовать проверку значений одной строки с другой (пароль с повторите паролем)?

    Psixodelik
    @Psixodelik
    Преподаватель на Hexlet


    По такому принципу можешь делать как уже угодно. Хоть по клику, хоть при вводе

    Ответ написан
    Комментировать
  • Почему не выводит alert?

    JimmiJanger
    @JimmiJanger
    Любопытный активист, под маской ленивого нуба.
    У вас переменная С во второй строчке, var с=prompt(" ...
    равна русской букве с
    Ответ написан
    1 комментарий
  • Почему не выводит alert?

    потому что у вас синтаксическая ошибка вот тут
    var с=prompt("Введите число с чтобы узнать степень b, из выражения a^b=c"); //или тут
    alert("Степень b = " + stepen(a,c));

    вообщем у тебя с - где то русская где то английская

    var a=prompt("Введите число а чтобы узнать степень b, из выражения a^b=c");
    var c=prompt("Введите число с чтобы узнать степень b, из выражения a^b=c");
    function stepen (a,c)
    {
        var n=0;
        while (c>1)
        {
            if(c%a==0)
            {
                c=c/a;
                n++;
            }
        }
       return n; 
    }
    alert("Степень b = " + stepen(a,c));

    заглядывай иногда в консоль
    Ответ написан
    Комментировать