1. 程式人生 > >[C++]C++ 函式指標 實現 函式名字串 到 函式呼叫 cmath.h

[C++]C++ 函式指標 實現 函式名字串 到 函式呼叫 cmath.h

程式碼功能

  1. 從命令列讀取格式為 函式名 數值 的輸入,例如: log10 1000
  2. 在命令列輸出呼叫對應函式名的函式計算結果,例如: log10(1000) = 3

完整原始碼

// C++ code

#include <iostream>
#include <cmath>
#include <map>

typedef double (* PtrFun) (double x);

class FunctionEntry
{
public:
    PtrFun pFun;    
    std::string strFun;
};

std::map <std
::string, PtrFun>
FunTab; FunctionEntry funEntry = {std::log10, "log10"}; int main() { std::cout << " funEntry.strFun : " << funEntry.strFun << std::endl; FunTab["log10"] = funEntry.pFun; std::cout << std::log10((double)100) << std::endl; std
::cout << FunTab["log10"]((double)100) << std::endl; std::string pS; double x; // log10 1000 std::cin >> pS >> x; std::cout << FunTab[pS](x) << std::endl; return 0; }

測試執行

 funEntry.strFun : log10
2
2
log10 1000
3

--------------------------------
Process exited after 5.727 seconds with return value 0 請按任意鍵繼續. . .

程式碼分析

引入標準

  • 利用C庫自帶的函式,呼叫之直接進行計算;
#include <cmath>

函式指標

  • 利用關鍵詞 typedef 宣告一種新的型別 PtrFun
typedef double (* PtrFun) (double x);
PtrFun pFun;
  • 兩種寫法等價,
    • pFun是一個指向帶有double型別的引數返回double型別的函式的指標,例如: 函式sin(π)cos(π)都接受一個double型別的引數π(3.1415926...),同時會返回相應的一個double型別的結果0.0或者-1.0;
    • 即只要是接受double型別又返回double型別的函式,諸如sin cos log log10 等等都可以用這個函式指標來指向;
double (* pFun) (double x);
  • 可不可以給一個int 返回一個double,可以,那就按照下面這樣寫,並且全部滿足給intdouble這種格式的函式都可以被pFun2 指向了;
double (* pFun2) (int x);

雜湊表

  • 建立字串與對應函式指標之間的聯絡
std::map <std::string, PtrFun> FunTab;

函式地址

  • C庫中函式名字就是函式地址,用std::log10 就是呼叫以10為底求對數,C++能懂!
FunctionEntry funEntry = {std::log10, "log10"};
  • 直接呼叫函式和通過函式指標呼叫函式的對比,效果是一樣的,都會輸出2,因為(100 = 10^2);
// map的寫法,使得字串log10 真正與 函式 std::log10的指標建立起了聯絡,從而能在O(1)的時間內訪問到;
    FunTab["log10"] = funEntry.pFun;

    std::cout   <<  std::log10((double)100)         <<  std::endl;

    std::cout   <<  FunTab["log10"]((double)100)    <<  std::endl;

識別字符串呼叫對應函式

  1. 命令列標準讀入代表函式名的字串pS 以及 想要計算的數值
  2. 通過雜湊表找到對應的函式指標FunTab[pS]
  3. 通過函式指標直接 呼叫函式FunTab[pS] (x)
std::string pS; 
    double x;

    // log10 1000
    std::cin >> pS >> x;
    std::cout << FunTab[pS](x) << std::endl;

引用參考

相關推薦

[C++]C++ 函式指標 實現 函式字串函式呼叫 cmath.h

程式碼功能 從命令列讀取格式為 函式名 數值 的輸入,例如: log10 1000 在命令列輸出呼叫對應函式名的函式計算結果,例如: log10(1000) = 3 完整原始碼 //

C語言函式指標實現多型特性

1、函式指標 函式指標是指向函式的指標變數,本質上是一個指標,類似於int*,只不過它是指向一個函式的入口地址。有了指向函式的指標變數後,就可以用該指標變數呼叫函式,就如同用指標變數引用其他型別變數一樣。 指標函式一般有兩個作用:呼叫函式和做函式的引數。 2、函式指標實現多

c++寫一個函式實現輸入一個字串,將其中的字元按逆序輸出

#include "stdafx.h" #include <iostream> #include <string.h> using namespace std; #define N 20 int _tmain(int argc, _TCHAR* argv[]) {

c語言中的 strcpy和strncpy字串函式使用介紹

1.strcpy函式 函式原型:char *strcpy(char *dst,char const *src)            必須保證dst字元的空間足以儲存src字元,否則多餘的字元仍然被複制,覆蓋原先儲存在陣列後面的記憶體空間的數值,strcpy無法判斷這個問題因為他無法判斷字元陣列的長度。

C語言字串函式總結(部分常見字串函式

1.atoi()函式:將字串轉換成整數 標頭檔案:#include < stdlib.h > 定義函式:int atoi(const char *nptr); 函式說明:atoi()

java實現C語言編譯器:實現有引數的函式呼叫

更詳細的講解和程式碼除錯演示過程,請參看視訊 用java開發C語言編譯器 上一節,我們實現了沒有引數傳遞的函式呼叫,本節,我們看看如何實現有引數傳遞的函式呼叫。 有引數的函式呼叫要比無引數的函式呼叫複雜的多,一個難題在於,我們需要確定引數變數的作用域,例如

利用C++的operator new實現同一物件多次呼叫建構函式

00417A60  push        ebp  00417A61  mov         ebp,esp 00417A63  push        0FFFFFFFFh 00417A65  push        offset __ehhandler$_main (425954h) 00417A6A

寫一函式實現兩個字串的比較

寫一函式,實現兩個字串的比較。即自己寫一個strcmp函式,函式原型:  int stremp(char *p1,char*p2) 設p1指向字串s1,p2指向字串s2。要求:當s1=s2時,返回值為0。當s1不等於s2時,返回它們二者的第一個不同字元的ASCII碼差值(如“BOY”與

C/C++】用指標實現二維陣列的傳遞、使用的4種示例,及各種變形。

請看例程。 #include <stdio.h> #include <stdlib.h> /* *func1:用int a[]傳遞二維陣列 *func2:用int a[][10]傳遞二維陣列 *func3:用int *a[10]傳遞二維 *

一種使用函式指標實現狀態機的方法

結構定義  1 struct state_machine { 2     int state; 3      4 }; 5  6 enum {  7     s1, 8     s2, 9     10     sn11 };   假設s1為初始狀態,狀態變遷為s1->s2->

簡單用函式指標陣列和回撥函式實現計算器

利用函式指標陣列簡單實現計算器 函式指標陣列:以char *(*p[3])(char *)為例解釋,這是一個數組,陣列名為p,陣列記憶體儲了3個指向函式的指標 這些指標指向一些返回值型別為指向字元的指

C++】使用指標實現資料交換

使用指標變數實現交換兩個變數(a,b)的值 #include"iostream" using namespace std; //使用指標變數實現交換兩個變數(a,b)的值 void swap(

函式指標實現轉移表代替switch語句

下面舉例說明函式指標陣列實現轉移表來代替switch語句,例如一個簡單的學生管理系統要實現學生的新增,刪除,修改.....等 主函式裡面我們首先想到程式碼如下:我們會根據選擇的操作在switch中呼叫刪除,新增,修改等函式,不會在case語句下面實現具體的操作函式 #in

C++ 練習:用指標實現

使用C++的指標實現一個簡單版的棧 stack.h #ifndef stack_hpp #define stack_hpp #include <stdio.h> class St

結構體和函式指標實現加減乘除

構思: 建立結構體,結構體的成員中有一個成員為函式指標,賦值後可指向各個演算法的地址; 當輸入add 1 2時,指標陣列分別指向add,1和2; 隨後進行字串比較,判斷進入哪一個演算法; 實現:

Eratosthenes 篩選法 c語言 陣列+指標實現

#include<stdlib.h>#include<stdio.h> #define SIZE 1000#define TRUE 1#define FALSE 0int main(){    char sieve[ SIZE ];    char *

Oracle SQL函式listagg實現多行字串連線

listagg 函式將組內的資料通過 order by 排序後,再連線到一起,可以指定分隔符。輸入多行,輸出一行或多行。常用來將值連線成逗號分隔的資料。 語法: 三個使用場景: As a single-set aggregate function, LISTAGG

c語言使用指標實現二叉樹遍歷

使用指標實現二叉樹的定義,建立,以及前序遍歷,中序遍歷,後續遍歷。 /* 該程式實現了二叉樹的建立,以及樹的遍歷,前序遍歷,中序遍歷,後序遍歷。 */ #include <stdio.h> #include<stdlib.h> #include &

利用函式指標實現父類函式呼叫子類函式

父子類關係 對於繼承關係中的父類和子類,我們可以說子類是父類的一種,子類繼承了父類的屬性和行為。因此,子類可以訪問父類的所有非私有成員。相反,父類一般情況下是不能訪問子類成員的。然而,我們可以通過一些方法間接的實現父類訪問子類,即父類函式訪問子類函式。

C++ 之 智慧指標實現

面試的時候,被問到了智慧指標,之前的確看過C++ primer,然而,都忘掉了。。。。自己實現了一下share_ptr。。寫完以後翻了翻書,才發現,和書上的並不差多少。。 智慧指標型別: share_ptr, weak_ptr, unique_ptr template &l