2017-01-14 5 views
0

Ниже приведен фрагмент кода, который я пытался запустить там, где у меня есть функция, которую я хочу запустить (dN) в моей основной функции, которая возвращает значение типа complex<double>.Использование функций внутри функций

#include <iostream> 
#include <complex> 
#include <cmath> 
using namespace std; 

const complex<double> Im1(0.0,1.0); //imaginary number definition 

class Functions{ 
public: 
    complex<double> dN(complex<double> **N, int k, int i, complex<double> kN, double T1){ 
     complex<double> OUT = Im1*(N[k][i]+kN)/(T1); 
     return OUT; 
    }; 

}; 

int main(int argc, const char * argv[]) { 

    //...more code here 

    complex<int> **NM = new complex<int>*[1000]; //1000x500 array 
    //run loop to initialize 
    for (int i = 0; i < 1000; ++i) 
    { 
     NM[i] = new complex<int>[500]; 
    } 

    complex<double> dN_OUT = Functions::dN(**NM,1,20,0.,20.); 

    return 0; 
}; 

Хотя этот код не работает и возвращает ошибку: Call to non-static member function without an object argument

Основываясь на моем понимании, C++ не позволяет nested functions и мой код выше не будет работать, потому что я называю отдельную функцию в моей главной функции , Хотя (по ссылке), похоже, можно реализовать «локальные классы», определив функцию внутри структуры, которая должна находиться внутри основной функции. Хотя, когда я пытаюсь это сделать:

int main(int argc, const char * argv[]) { 

    complex<int> **NM = new complex<int>*[1000]; //1000x500 array 
    //run loop to initialize 
    for (int i = 0; i < 1000; ++i) 
    { 
     NM[i] = new complex<int>[500]; 
    } 

    struct Functions{ 
     complex<double> dN(complex<double> **N, int k, int i, complex<double> kN, double T1){ 
      complex<double> OUT = Im1*(N[k][i]+kN)/(T1); 
      return OUT; 
     }; 

    }; 

    complex<double> dN_OUT = Functions::dN(**NM,1,20,0.,20.); 

    return 0; 
}; 

ошибка сохраняется. В конечном счете, я просто хочу использовать функцию dN, которая возвращает выход типа complex<double> в моей основной функции, но я не уверен в лучшем/рабочем способе реализовать это.

ответ

2

Я считаю, что вы неправильно поняли, что такое вложенная функция. Вложенный функция будет выглядеть следующим образом:

int main() 
{ 
    void nested() {} // not allowed in C++ 
} 

Решение вашей проблемы в сообщении об ошибке, предоставленной компилятором:

Call to non-static member function without an object argument 

Взгляните на следующее:

// Example 1 
struct Functions { 
    void func() {} 
}; 

int main() 
{ 
    // to call Functions::func() you would need to have an object 
    // of type Functions because Functions::func() is not a static function 
    Functions f; 
    f.func(); 
} 

// Example 2 
// by making func() static you can call it without an object: 
struct Functions { 
    static void func() {} 
}; 

int main() 
{ 
    Functions::func(); // OK 
} 
+0

Некоторые * компиляторы * принимают вложенные функции (как расширение языка, которым они обрабатываются), которые действительно не являются частью стандартного C++ 11. GCC принимает [вложенные функции] (https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.htm) для C, а не для C++ –

+0

@BasileStarynkevitch Это правда, но я не могу вспомнить последний раз, когда я скомпилированный без флага '-pedantic'. – DeiDei

+0

@DeiDei Ahh да, извините. Моя первоначальная попытка состояла в том, чтобы использовать вложенную функцию, как вы сказали, хотя впоследствии я заменил ее на класс вне основной функции (это код, вышеописанный). Спасибо за ваш ответ - он работает, хотя я просто тестирую код на этом этапе и скоро вернусь к вам. Просто для уточнения, почему просто добавление статической работы? – Mathews24

2

Ultimately, I am simply wanting to use the function dN that returns output of type complex within my main function, but am unsure of the best/operational way to implement this.

Используйте бесплатную функцию, например main есть, если dN имеет конкретную причину, чтобы быть частью класса:

complex<double> dN(complex<double> **N, int k, int i, complex<double> kN, double T1) 
{ 
... 
} 

int main(int argc, const char * argv[]) { 
    ... 
    //like this 
    complex<double> dN_OUT = dN(NM,1,20,0.,20.); 
    //not like this 
    //complex<double> dN_OUT = dN(**NM,1,20,0.,20.); 
} 
+0

Но тогда вы получите сообщение об ошибке: 'Нет подходящей функции для вызова 'dN'' – Mathews24

+0

@ Mathews24, я упустил из виду тот факт, что вы используете' ** NM' вместо 'NM'. Это ортогонально первому вопросу. – chris

1

Вариант 1: Вы можете сделать это с классом, как показано ниже

#include <iostream> 
#include <complex> 
#include <cmath> 

using namespace std; 

const complex<double> Im1 (0.0, 1.0); //imaginary number definition 

class Functions { 
public: 
    complex<double> dN (complex<double> **N, int k, int i, complex<double> kN, double T1) 

    { 
     complex<double> OUT = Im1*(N[k][i] + kN)/(T1); 

     return OUT; 
    }; 

}; 

int main (int argc, const char * argv[]) { 

    //...more code here 

    complex<double> **NM = new complex<double>*[1000]; //1000x500 array 
               //run loop to initialize 
    for (int i = 0; i < 1000; ++i) 
    { 
     NM[i] = new complex<double>[500]; 
    } 

    Functions fun; //create class instance 

    //call the function NOTE the changes here i.e not correct passing **NM 
    complex<double> dN_OUT = fun.dN (NM, 1, 20, 0., 20.); 

    return 0; 
}; 

Вариант 2 (упомянуто другими Направляйте вызов с изменениями вместо ** NM вы должны использовать NM.

complex<double> dN(complex<double> **N, int k, int i, complex<double> kN, double T1){ 
    ... 
} 

int main(int argc, const char * argv[]) { 
    ... 
    complex<double> dN_OUT = dN(NM,1,20,0.,20.); 
} 
Смежные вопросы