Тема: Разбор "задачки" для программистов
Прошлую тему автор закрыл, а так его хотелось макнуть в его "творение". Вот ссылка на тему https://price-altai.ru/topic586984-zada … istov.html
Хочу разобрать его амнокод, а то судя по тону из предыдущей ветки, он считает себя просто офигенным специалистом. Опишу найденное комментариями к исходному тексту "задачки".
// здесь нет необходимых включаемых файлов, "задачка" не соберется. Что в итоге имеем. Автор предлагает найти какую-то
// проблему, но даже не убедился что других проблем нет.
using namespace std; // офигенное решение заюзать весь std, за такое нужно бить палкой по рукам.
class Fbase // Судя по названию складывается ощущение что это какой-то базовый класс, но как видно дальше это не базовый класс,
// а реализация функциональности. Название выбрано очень неправильно.
{
string name;
public:
Fbase(string n) { // передача строки по значению вместо const string &, лишнее ненужное создание временного объекта
name = n;
}
~Fbase()
{
}
void Do()
{
}
};
class F
{
Fbase *fbase; // сырой указатель, в случае исключений будет утечка памяти.
string name; // внутри fbase уже содержится name, зачем здесь еще одна копия?
public:
F(string n){ // опять создание временной копии строки
name = n; // не используются списки инициализации. Сначала будет выполнено конструирование по-умолчанию
fbase = new Fbase(n); // и только потом выполнение operator=. Перепутан местами порядок инициализации членов класса.
}
~F(){
delete fbase;
}
void Do(){
fbase->Do();
}
// поскольку явно не указано, что класс не является не копируемым, то нужно определить operator=, ибо внутри есть указатель и
// operator= по-умолчанию его скопирует, вместо создания нового объекта-копии. Аналогично дела обстоят с конструктором копий.
// Автор думает, что вся проблема состоит именно в этом. Но проблема не в этом, а в подходе к разработке.
};
void Fun1(F f){ // опять передача по значению, как правило это признак низкого уровня программиста
// здесь нужна, либо передача по ссылке, либо по константной ссылке.
f.Do();
}
void Run()
{
F f("n1");
Fun1(f);
}
int main(void)
{
Run();
getchar();
return 0;
}