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

Шаблон за променливи или име на променлива?

Здравей, Живко!

В 00:42:10 - 00 42:30 от видеото "Exercise: Advanced Class Members and Code Organization"/21.1.2019 обясняваш, че

Това Naming е името на променливата... име на променливата и нищо друго...

Значи, имаме някаква променлива(Naming??) и ето (с??) този синтаксис тип на променливата (e??) translator...

От казаното се разбира, че името на променливата е Naming, a типът на променливата е translator. В предишното видео пак говореше същото(ако искаш, ще го прегледам наново, за да намеря къде точно?). Наистина ли с typename се създават променливи или аз не съм те разбрал?

0
C++ Advanced 23/01/2020 00:16:05
Filipbg avatar Filipbg 26 Точки

"Naming" си е обикновено име на template-a. Просто така е кръстено. Това е начина да адресираш (достъпваш) мембърите в класа чрез темплейта. Същото нещо както при namespace-овете. Само че вместо с ::, просто < > в началото. Поне аз така ги разбирам нещата и ми изглеждат ясни.

1
23/01/2020 18:22:57
zzerro avatar zzerro 14 Точки

...Същото нещо както при namespace-овете...

По-скоро същото като class - създаваш тип за променливи.

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

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

Благодаря ти, че питаш пояснителен въпрос и се извинявам, ако не съм успял да предам информацията по най-точния начин.

Ще си позволя да цитирам, колегата Filipbg, защото отлично е адресирал въпроса ти.
"Naming" си е обикновено име на template-a. Просто така е кръстено. Това е начина да адресираш (достъпваш) мембърите в класа чрез темплейта.

От горенаписаното изречение става ясно, че това "Naming" изпълнява 2 роли.
1) Име на template-a
2) Начин за адресиране на променлинвата от тип template

Давам пример

template < typename Naming>
struct MyStruct {
  MyStruct(Naming input) {
    variable = input;
  }  

  Naming variable;
};

int main() {
  MyStruct<int> intStruct(3);
  MyStruct<double> doubleStruct(3.14);

  std::cout <<  intStruct.variable; //достъпваме и принтираме int променливата "3"
  std::cout <<  doubleStruct.variable; //достъпваме и принтираме double променливата "3.14"

  return 0;
}

Сега си представи, че структурата кода за MyStruct най-отгоре го заменя ето с този код
template < typename T>
struct MyStruct {
  MyStruct(T input) {
    variable = input;
  }  

  T variable;
};

Програмата е едно към едно с горната. Единствено, което сменихме е името на template-а, а именно от "Naming" на "T".

Поздрави

0
zzerro avatar zzerro 14 Точки

Ами да:

"Naming" си е обикновено име на template-a. Просто така е кръстено.

шаблоните също имат имена, но не са имена на променливи!

Можеш ли да кажеш нещо за typeid - как да проверим какво* произвежда ИМЕТО НА ШАБЛОНА?

*променливи от какъв тип

0
WasteOfRAM avatar WasteOfRAM 5 Точки

Пусни си този код и ще видиш.

 

#include <iostream>
#include <string>
#include <typeinfo>
#include <vector>
#include <list>
#include <map>

template<typename Naming>
void print(Naming& var)
{
	std::cout << typeid(Naming).name() << std::endl << std::endl;
}


int main()
{
	int i = 10;
	std::string str = "String";
	double d = 15;
	std::vector<int> vec;
	std::vector<std::string> vecStr;
	std::map<float, long> map;
	std::list<std::map<std::string, std::vector<const char*>>> nonsense;

	print(i);
	print(str);
	print(d);
	print(vec);
	print(vecStr);
	print(map);
	print(nonsense);
	
	std::cin.get();
	return 0;
}

"Naming" е каквото си поискаш. Каквото му подадеш това ще бъде. Не произвежда нищо просто го поставяш за да знае програмата че там очаква тип и ако го разпознае като тип и може да извърши операциите който си му задал ще ги изпълни.

Представи си го на лист хартия и на всякъде кадето пише "Naming" вместо това пише много точки "................". На точките с химикал си попълни какъв тип искаш.

1
zzerro avatar zzerro 14 Точки

...на всякъде кадето пише "Naming" вместо това пише много точки "................". На точките с химикал си попълни какъв тип искаш.

ето защо може да е каквото и да е, само и само не може да е променлива. Променливите винаги съдържат СТОЙНОСТ (ако не я инициализираш изрично, тя ще бъде случайна; но непременно през името на променливата  ще достъпим някаква стойност).

Имената на шаблоните не съдържат никаква стойност, също както и имената на класовете. С тях се създават променливи (създаваните от класове променливи наричаме "обекти").

Досега в курсовете се случваше лекторът да обърка "клас" с "обект" и аз мислех, че е грешка на езика. Не исках да издребнявам, макар че се обърквам и не мога да разбера какво говори. Сега разбирам, че не е грешка в бързината, а нещо друго... Явно си прав - не трябва да слушам внимателно, а да гледам да реша задачите...

0
28/01/2020 00:14:34