Loading...
zzerro avatar zzerro 16 Точки

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

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

В 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
j.petrov_90 avatar j.petrov_90 373 Точки

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

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

Ще си позволя да цитирам, колегата 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 16 Точки

Ами да:

"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 16 Точки

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

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

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

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

0
28/01/2020 00:14:34
j.petrov_90 avatar j.petrov_90 373 Точки

@zzero, коментарът ти наистина ме хвърля в трета глуха.
Съжалявам, че съм объркал (взаимно заменил) "клас" и "обект".

Казвам го без лоши чувства:
Изказването ти "не трябва да слушам внимателно, а да гледам да реша задачите..." е грешно.
Винаги в рамките на този и на предишния курс съм повтарял, че се старая да ви науча, а не просто да си изпея материала и да си ходя.
Затова и постоянно се мъча да ви снабдявам с любопитни факти от практиката, които няма да ги видиш в слайдовете.

Напротив, трябва да слушаш внимателно, но трябва и да отчетеш няколко други фактори:
1) Занятията са колекция от:
  - преподаване на лектора (в случая аз)
  - записки в лекцията (слайдове)
  - демотата, които разглеждаме
  - изводи, които извличаме от дискусиите по време на лекцията.
2) Аз не съм робот (човек съм и правя грешки)
3) Не е изключено някъде в слайдовете да има допусната грешка. Тя няма да е умислена, но все пак има такава възможност.

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

Не твърдя, че ще си го помислиш, но все пак, ако след това мое изказване има някой, който си мисли:
"ама... аз сега, ако трябва да следя всяко твое изказване дали е вярно...то какъв е смисъла от този курс...аз нали затова си плащам да ме обучават".
Веднага ще контрирам с факта, че по тая логика на мен ми плащат да преподавам, а не да ви науча.
Аз няма да говоря глупости умишлено и не го и правя.

Поздрави

0
28/01/2020 11:13:40
zzerro avatar zzerro 16 Точки

Да говорим конкретно. Ето слайда към твоето обяснение:

#include <iostream>
#include <string>
#include <vector>

#include "NoteName.h"
#include "SolfegeNoteNaming.h"

template<typename Naming>
class NoteParser {
	Naming translator;
public:
	NoteName translate(const std::string& noteText) const {
		return translator(noteText);
	}
};

int main() {
	NoteParser<SolfegeNoteNaming> parser;

	std::vector<NoteName> notes;
	std::string noteText;
	while (std::cin >> noteText && noteText != "end") {
		NoteName note = parser.translate(noteText);
		notes.push_back(note);
	}

	for (NoteName note : notes) {
		std::cout << note << " ";
	}

	return 0;
}

100 пъти го гледах и все още не виждам "променливата Naming", за която ти така настойчиво говориш. Ти виждаш ли я? Тя каква стойност има(щом казваш, че е от тип translator)?

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