Loading...
genadi1980 avatar genadi1980 1 Точки

Templates C++ Code Organisation: Task 3. Parser

Подхода ми към тази задача беше да закоментирам случаите type == "w" и  type == "s" и да се опитам да я реша за "i". След това да опитам да я направя във вид на template, но срещам трудност в този фрагмент:

    if (type == 'i') {
        Parser p(std::cin, stopLine);
        int n;
        std::vector<int> numbers;
        while (p.readNext(n)) {
            numbers.push_back(n);
        }
        printVector(numbers);
    }

Трудността идва от там, че се опитвам да подам std::cin, stopLine директно в конструктора и не знам как да го напиша, че да тръгне. Това съм измислил до сега. Моля, за помощ и идеи.

 

class Parser {
private:
    std::istream & line;

public:
    Parser(std::istream & LINE) : line(LINE) {}


    bool readNext(int n) {
        if (line >> n)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

};

Тагове:
0
C++ Advanced
pavlinapppp avatar pavlinapppp 17 Точки
Best Answer

В конструктора на класа трябва да има два аргумента (вижда се от този ред Parser<int> p(std::cin, stopLine); ) значи трябва да добавим към класа и една променлива от тип стринг. Това ще е стринга-разделител, който ще се инициализира с конструктура. Аз лично съм използвала и още една променлива от тип Т, която ми съдържа текущия елемент. Използвам я във функцията на класа bool readNext(T &n) , като й въвеждам стойност от конзолата, прекарвам тази стойност през ostringstream, за да преодолея проблема с Song класа и да направя стойността на една песен само от един стринг(така мога да я сравнявам със стринга разделител)

Дано да съм помогнала

1
genadi1980 avatar genadi1980 1 Точки

Благодаря, подкарах го с int. Сега ще го мисля как да стане с <Т>.

0
genadi1980 avatar genadi1980 1 Точки

Колеги успях да подкарам нещата да вървят със INT и със STRING, но естествено изпитвам трудности със Song и Template

Стигнах до тук: https://pastebin.com/vUDtVzTv

Подозирам, че е нещо простичко, но все пак ми дава грешка, въпреки, че предефинирах оператора "==":

Severity Code Description Project File Line Suppression State

Error C2678 binary '==': no operator found which takes a left-hand operand of type 'T' (or there is no acceptable conversion) 03Parser c:\users\ggeorgiev20\documents\git\softuni\c++\c++ advanced\templates\03parser\printutils.h 19

Error C2064 term does not evaluate to a function taking 1 arguments 03Parser c:\users\ggeorgiev20\documents\git\softuni\c++\c++ advanced\templates\03parser\printutils.h 17

Може ли малко помощ пак.

0
kolioi avatar kolioi 641 Точки

Първата грешка на 19 ред е защото сравняваш n, чийто тип е T, със stopLine което е string - т.е. различни типове. За втората грешка на 17 ред виж как се използва конструктора на ostring stream. Всъщност колежката се е объркала малко, трябва ти istringstream :)

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.