Этот код ужасен (как и учебное пособие, если это среднее качество материала).
Во-первых, void main()
не является действительной подписью для main
.В этом случае должно быть int main()
.Во-вторых, если Compose
предполагается создать с помощью указателей, то его конструктор должен быть объявлен как Compose(Ftype* f, Gtype* g)
, а не Compose(Ftype f, Gtype g)
.В-третьих, код должен включать <iostream>
и префикс cout
и endl
с std::
(или использовать using namespace std
, но это все равно будет довольно плохо).Наконец, все new
должны иметь соответствующий delete
, но еще лучше было бы использовать умные указатели или вообще не указывать.
В любом случае, после всего этого заполнение пробелов относительно просто.
Конструктор будет выглядеть так:
Compose(Ftype f,Gtype g) {
this->f = f;
this->g = g;
}
... что очень плохо, потому что оно вызывает использование this->
, когда в нем нет необходимости (либо называйте параметры по-другому, либо используйте членсписок инициализатора).
И оператор вызова будет записан так:
typename Ftype::retType operator()(typename Gtype::argType x) {
return (*f)((*g)(x));
}
Тип аргумента и тип возвращаемого значения - это те, которые передаются в базовый класс FuncObj
в качестве аргументов шаблона, а затем вызовпросто составляет f
и g
.
Демо .
Лучший код без использования указателя будет выглядеть так:
template<typename Ftype, typename Gtype>
class Compose : public FuncObj<typename Gtype::argType, typename Ftype::retType> {
protected:
Ftype f;
Gtype g;
public:
Compose(Ftype f, Gtype g)
: f(f), g(g) {
}
typename Ftype::retType operator()(typename Gtype::argType x) {
return f(g(x));
}
};
int main() {
auto d = DivideBy(2);
auto t = Truncate();
auto c1 = Compose(d, t);
auto c2 = Compose(t, d);
std::cout << c1(100.7) << "\n";
std::cout << c2(11) << "\n";
}
Демо .
Вместо использования Java-подобных инициализаций Type *var = new Type(args);
, просто используйте значение (auto var = Type(args);
или Type var(args)
).C ++ не является Java.
Обратите внимание, что вам даже не нужно указывать аргументы шаблона для Compose
: они выводятся из аргументов конструктора.