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

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 от горните скоби.

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

Привет,

template<typename Naming>
class NoteParser {
    Naming translator; //тук се извиква default-ния конструктор на обект от тип "Naming" или template-ния параметър. 

Това е същото като да имаш
class Car {
}

Car mercedes; //тук се извиква default-ния конструктор на обект от тип "Car".

Обяснявам какво прави този код:
    NoteName translate(const std::string& noteText) const {
        return translator(noteText);

Това е функция, която се казва "translate".
- Тя приема като аргумент константна референция от std::string.
- Тази фунция връща стойност (нейния return type) от тип NoteName.
- NoteName е някакъв клас, който ние сме написали в нашата програма.
- translator(noteText) и извикване на оператора кръгли скоби на обекта "translator" като аргумент, на който се подава константна референция от std::string с име "noteText".

Забележи, че оператора кръгли скоби но обекта "translator" връща обект от тип "NoteName".
Този обект пък от своя страна се връща като резултат на функцията translate, за която говорихме до сега.

“Вътре в скобите подаваме на обекта стринг(въпреки че конструктура му изисква char).“
Конструктура на NoteName приема 1 char. Само, че в случая не извикваме конструктура на NoteName, а извикваме оператора кръгли скоби на нашия template-тен обект "translator".

Поздрави

0
04/03/2019 22:28:53