Wskaźnik na fukncję a konstruktor

0

Witam, piszę właśnie metodę tworzącą nowe obiekty różnych klas w pętli iteracyjnej, dla każdej klasy różną ilość razy. Aby nie przepisywać pętli po kilka razy chciałem zrobić to optymalniej poprzez stworzenie do tego oddzielnej funkcji w następujący sposób:

 void produce()
    {
        _produce(globespercycle, globe); // globe to klasa (żądany konstruktor)

tak chciałbym ją wywoływać

void _produce(int itemspercycle, product_constructor p_constructor)
    {
        for(int i = 0; i < itemspercycle; i++)
        {
            product * p = new p_constructor; // rózne klasy dziedziczące po product
            if(head == NULL)
                head = p;
            else
                head->next = p;
            if(p->volume < smallest_item)
                smallest_item = p->volume;
        }
    }

a to jej ciało.

Problem wystąpił przy linijce

product * p = new p_constructor; 

gdzie

typedef ( * product_constructor )();

Kompilator zgłasza błąd "ISO C++ forbids declaration of 'product_constructor' with no type [-fpermissive]"

Domyślam się, że popełniam błąd merytoryczny próbując zrobić takie przypisanie, interesuje mnie jak zrobić taką funkcję produce() profesjonalnie.

1
typedef ( * product_constructor )();

Brakuje typu który zwraca taka funkcja. Jeżeli funkcja nic nie zwraca, to

typedef void (*ptr)();
void _produce(int itemspercycle, product_constructor p_constructor)
...
    product * p = new p_constructor;

Przecież p_constructor to wskaźnik na funkcję, a nie żadna klasa.
Już widać, jak dziwne nazewnictwo się mści.

0

Właśnie chodzi o to, że miałem zamiar przekazywać w ten sposób konstruktory (aby tworzyć obiekty różnych klas), a one nie mają void'a przed sobą. Po takiej próbie kompilator zgłasza
expected type-specifier before 'p_constructor'

1

Przekaz wskaźnik na jakiś obiekt klasy i wywolaj konstruktor kopiujący. A ogólnie nie myślałeś, by zrobic z tej funkcji template?

0

Template okazało się być dobrym rozwiązaniem, dziękuje za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1