Funkcja zwracająca adres- przypisanie do nowego wskaznika.

0

Witam! Mam dylemat. Jestem w trakcie czytania książki Grębosza. No i w dziale wskaźniki trochę się zamotałem. Co prawda nie jest to tam poruszone, ale mnie ciekawi.
Powiedzmy, że mamy taką sytuację:

double funkcja(int a, char b, bool c){
  return a;
}
//teraz funkcja zwracająca adres:
double (*zwrot(int d))(int, char, bool){
{
  if(d==2) cout<<"Brawo!";
  return funkcja;
}
int main()
{
  double (*wsk)(int, char, bool); //tutaj nie jestem pewien, chodzi mi o to, żebym mógł przypisać adres funkcji zwrot do mojego wskaźnika
  wsk = (*zwrot()); //no ale kompilator wyrzuca błąd, że za malo argumentow
  return 0;
}

jak to poprawić, żeby chodziło?

3

Bo funkcja zwrot ma parametr: d.

0

chyba pierwszy raz widze w zyciu takie cos. Dla Twojej informacji. NIGDY czegos takiego nie napiszesz, bo nie bedziesz potrzebowac po prostu

0

dobra, nie zauważyłem u góry :) oki dzięki już rozumiem;

1
double (*zwrot(int d))(int, char, bool)

to jest funkcja przyjmująca int, i zwracająca wskaźnik na funkcję double(int,char,bool).

zwrot()

Wołasz ją z zerem argumentów, pomimo, że oczekuje jednego. Nic dziwnego, że kompilator o tym mówi.

Przy okazji: po co dokonujesz dereferencji otrzymanego wskaźnika?

double (*zwrot(int d))(int, char, bool){
{

Za dużo klamerek.

2
double (*zwrot(int d))(int, char, bool);

Takich potworków się nigdy nie robi.

Rozbija się to na dwie deklaracje: typu zwracanego (wskaźnik na funkcję) i funkcji zwracającej ten typ:

typedef double (*funkcja_t)(int, char, bool);

funkcja_t zwrot(int d);

I wszystko jasne.

0

Wolę zapis:

typedef double funkcja_t(int, char, bool);
funkcja_t *zwrot(int d);
3

Jeśli już przy tym jesteśmy to w C++11 może się obyć bez deklaracji osobnych aliasów dla każdego zwracanego typu

template<typename T>
using function_ptr = typename add_pointer<typename enable_if<is_function<T>::value,T>::type>::type;

function_ptr<double(int,char,bool)> zwrot(int d);

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