Exercises on Advanced Class Members and Code Organization - Task 2 - Notes
код в NotesMain.cpp
#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;
}
Във видеото към упражнението се казва, че
template<typename Naming>
class NoteParser {
Naming translator;
това е default конструктор... но default конструктор, на кое? До колкото разбирам създаваме template променлива и я кръщаваме translator... как така тя става конструктор? Не трябваше ли да носи същото име, като класа, за да е конструктор?
И също така не схванах return-ването в public полето на NoteParser... Значи веднъж пишем return translator(noteText) и след това в решението пишем return NoteName(letter)... не мога да схвана каква е практическата логика на това действие? Нали NoteName в конструктора си взима char, за да се създаде обект от него, a ние го викаме по следния начин:
NoteName translate(const std::string& noteText) const {
return translator(noteText);
Честно казано от тази задача не разбирам абсолютно нищо. Как така се разбира от това: return translator(noteText); че това е OverLoad-нат оператор кръгли скоби? Ако това беше на изпита, щях да седя и да го гледам 20 часа и да се чудя каква функция трябва да се напише, за да тръгне.
Ще започна дума по дума да предполагам кое какво прави и ако е възможно някой да ми дообясни ще е супер. Значи:
1-чрез NoteName искаме да създадем обект от тип NoteName.
2-translate е името на обекта.
3-Вътре в скобите подаваме на обекта стринг(въпреки че конструктура му изисква char).
4- Връщаме template, като вътре в скобите му подаваме string-a от горните скоби.