Софтуерно Инженерство
Loading...
+ Нов въпрос
peter.gaydeek avatar peter.gaydeek 2 Точки

Task 1 Compile, Code Organization and C++ Templates

Извинявам се за глупавия въпрос, но или аз съм нещо прегрял и не мога да схвана нищо или наистина съм много зле.Можете ли да ми обясните това "using STANDARD_TEMPLATE_LIBRARY;" тук какво трябва да правя с него:

#include "Defines.h"


int main() {
#ifndef DONT_COMPILE_THIS
    this here has compilation errors : )
#endif // !DONT_COMPILE_THIS
    using STANDARD_TEMPLATE_LIBRARY;
    string input;
    cin >> input;
    cout << input << endl;

    return 0;
}

 

пробвах какво ли не ....това Namespace ли е или трябва да го дефинирам по друг начин...просто при мен не става...свети в червено и това е ...

Тагове:
0
C++ Advanced
j.petrov_90 avatar j.petrov_90 118 Точки

Привет, колега,

Забележи, че имаш:
string input;

string-а не можеш да го достъпиш директно, защото се намира в namespace-а "std".
Има 2 начина да го достъпиш:
1) std::string
2) да имаш някъде над твоето извикване към string -  "using namespace std;"

В Лекцията миналия път учихме за предпроцесорни директиви (#define)
Както говорихме в лекцията те не се нищо по-различно от текстов find-and-replace.

т.е. STANDARD_TEMPLATE_LIBRARY май ми прилича на предпроцесорна директива... :)
Какво трябва да седи под тази директива оставам на теб да се сетиш.

Поздрави

0
23/02/2019 20:05:43
peter.gaydeek avatar peter.gaydeek 2 Точки

Мерси колега, но какво ли не изчетох и прегледах лекцията сигурно 20 пъти и НЕ МОГА! Не разбирам...какво трябва да направя...

#ifndef DEFINES_H
#define DEFINES_H
#define DONT_COMPILE_THIS

#define STANDARD_TEMPLATE_LIBRARY
#include <string>
#include <iostream>
using namespace std;

#endif // !DEFINES_H


това пиша и всичко светва нормално освен този "using" ...... какви ли не задачки решавах досега и тази която няй вероятно е от 5 реда не мога....

0
j.petrov_90 avatar j.petrov_90 118 Точки

Привет, отново.
Нямаш грижи. Обяснявам отдалече.

Правим си макро
#define ABRA CADABRA 

и по нататък в main()-а имаме
int main() {
    std::cout << ABRA << std::endl;
    return 0; 
}

Какво ще се случи?
Компилаторът преди да компилира твоя файл първо ще изпълни предпроцесорните директиви -> т.е. ще дифинира ABRA и по нататък в main()-а среща това ABRA и прави find-and-replace. Т.е. ABRA се заменя със CADABRA.

След като са се изпълнили предпроцесорните директиви сме останали със следния код:
int main() {
    std::cout << CADABRA << std::endl;
    return 0;
}

Компилацията на този код ще ти гръмне, защото ще ти изреве - "не знам какво е CADABRA".
(Ако беше "CADABRA" /в кавички/ - това вече е нещо, което компилатора знае и щеше да сработи).

Това беше само за демонстрация как работят нещата щом  не ти е станало ясно.
Дай сега да погледнем твоя случай.

Имаш #define STANDARD_TEMPLATE_LIBRARY
т.е. ти просто казваш - Дефинирам, че STANDARD_TEMPLATE_LIBRARY съществува, но то няма стойност.
Какво значи, че съществува?
Значи, че ако някой направи предпроцесорна проверка
#ifdef STANDARD_TEMPLATE_LIBRARY
//това би влязло тук, защото е дефинирано
#endif

Ок. Дефинирано е, но то няма стойност.
В скелета на програмата (в main()-а) имаш
using STANDARD_TEMPLATE_LIBRARY;
Компилаторът ще направи find-and-replace и това ще се разпъне до "нищо"
т.е. ще се получи кодът:
using ;

Това е компилационна грешка. Отделно, че string-а на долния ред ще ти гръмне, че нямаш std namespace-a.

И сега след тези 2 тона хакове от живота казваме: 
#define STANDARD_TEMPLATE_LIBRARY namespace std

След това кода:
using STANDARD_TEMPLATE_LIBRARY;
ще се разпъне до:
using namespace std;

По-здрави :)

1
24/02/2019 15:41:42
peter.gaydeek avatar peter.gaydeek 2 Точки

Привет отново!

Боже то какво било...мина ми през акъла, но дали го направих не помня... 

благодаря ти отново колега, сега дори разбрах много по-добре всичко!

По-здрави и от мен! Златен си!

0