c++委託詳解

一、c 委託報錯

在使用 c++ 委託的過程中,有時候會遇到各種報錯。常見的報錯有:

1、error C2276: ‘<類名>::<函數名>’: reference to function(<函數名>)implicitlydeclares C-style linkage

  這個錯誤通常是由於在委託聲明中使用了函數指針導致的,可以通過將委託聲明為 static 函數或者定義該委託的類為靜態類來解決。

2、error C2064: term does not evaluate to a function taking 0 arguments

  這個錯誤通常是由於委託的參數不匹配導致的,需要將委託的參數與目標函數的參數保持一致。

3、error C2440: ‘<類型>’: 句柄類型無效

  這個錯誤通常是由於委託的類型錯誤導致的,可以通過檢查委託的類型和目標函數的返回類型來解決。

#include <iostream>
using namespace std;

class Base{
public:
    virtual void Func1(){cout<<"Base::Func1"<<endl;}
    void Func2(){cout<<"Base::Func2"<<endl;}
};
class Derived : public Base{
public:
    virtual void Func1(){cout<<"Derived::Func1"<<endl;}
};

int main()
{
    Derived d;
    void (Base::* pFunc)() = &Derived::Func1;  //聲明一個委託
    (d.*pFunc)();   //調用委託
    return 0;
}

二、c 委託銷毀內存

在 c++ 中使用委託時,需要注意內存泄漏的問題。當使用 new 運算符在堆上動態分配內存時,需要手動釋放內存。在使用委託時,需要在析構函數中釋放內存。

#include <iostream>
using namespace std;

class Base{
public:
    virtual void Func1(){cout<<"Base::Func1"<<endl;}
    void Func2(){cout<<"Base::Func2"<<endl;}
};
class Derived : public Base{
public:
    virtual void Func1(){cout<<"Derived::Func1"<*pFunc)();
    return 0;
}

三、c 委託賦值

在 c++ 中,委託可以賦值給其他委託,也可以作為參數傳遞給其他函數。

#include <iostream>
using namespace std;

class Base{
public:
    virtual void Func1(){cout<<"Base::Func1"<<endl;}
    void Func2(){cout<<"Base::Func2"<<endl;}
    virtual ~Base(){}
};

class Derived : public Base{
public:
    virtual void Func1(){cout<<"Derived::Func1"<<endl;}
    ~Derived(){ cout<<"Derived::~Derived"<*pFunc)();
    delete b;
}

int main()
{
    Derived d;
    void (Base::* pFunc)() = &Derived::Func1;
    (d.*pFunc)();
    Call(pFunc);
    return 0;
}

四、c 委託優勢

c++ 的委託技術可以幫助我們更好地處理對象的函數調用。其主要優勢包括:

1、可以通用於任何對象類型的函數調用

2、可以動態確定被調用的函數

3、可以傳遞對象成員函數的指針作為參數

4、可以提高代碼的可讀性和可維護性

五、c 委託 函數指針

c++ 委託需要使用函數指針來引用一個對象的非靜態成員函數。函數指針與函數名類似,但函數指針指向的是函數的地址,可以用來調用這個函數。

#include <iostream>
using namespace std;

class Base{
public:
    virtual void Func1(){cout<<"Base::Func1"<<endl;}
    void Func2(){cout<<"Base::Func2"<<endl;}
    virtual ~Base(){}
};

class Derived : public Base{
public:
    virtual void Func1(){cout<<"Derived::Func1"<<endl;}
    ~Derived(){ cout<<"Derived::~Derived"<*pFunc)();
    delete b;
}

int main()
{
    Derived d;
    void (Base::* pFunc)() = &Derived::Func1;
    (d.*pFunc)();
    Call(pFunc);
    return 0;
}

六、c 委託會影響性能嗎

在 c++ 中使用委託會帶來一定的性能損失,因為委託需要創建一個對象來調用成員函數,而對象的創建和銷毀都需要一定的時間和內存資源。但這種性能損失非常小,可以忽略不計。

七、c 委託構造

在 c++ 中,委託構造函數是一種可以調用同一類的其他構造函數的構造函數。委託構造函數可以幫助我們省略一些冗餘代碼,並且可以更方便地初始化各種成員變量,提高代碼的可讀性和可維護性。

#include <iostream>
using namespace std;

class Point{
private:
    int x, y;
public:
    Point():Point(0, 0){}
    Point(int x):Point(x, 0){}
    Point(int x, int y):x(x),y(y){}
    void Print(){ cout<<"("<<x<<", "<<y<<")"<<endl;}  
};

int main()
{
    Point p1;
    p1.Print();

    Point p2(1);
    p2.Print();

    Point p3(2, 3);
    p3.Print();

    return 0;
}

八、c 委託 劉鐵猛

劉鐵猛是一位擁有碩士學位的青年C++程序員、博客寫手、技術講師、業界大牛級別人物。他在其博客中詳細介紹了 c++ 委託的相關知識,為廣大 c++ 程序員提供了非常有價值的參考。

九、c 委託 action

Action 是一個通用的委託類型,可以用來調用任何類型的函數。Action 的使用非常簡單,只需要使用 typedef 來定義即可。

#include <iostream>
using namespace std;

typedef void (*Action)();

void Func1()
{
    cout<<"Func1"<<endl;
}

void Func2()
{
    cout<<"Func2"<<endl;
}

int main()
{
    Action pAction = Func1;
    pAction();
    pAction = Func2;
    pAction();
    return 0;
}

十、c 委託做為變量選取

在 c++ 中,委託可以作為變量來存儲對象的成員函數指針。通過將委託聲明為一個變量,可以更方便地對成員函數進行重複調用。

#include <iostream>
using namespace std;

class Point{
public:
    int x, y;
    void Print(){cout<<"("<<x<<", "<<y<<")"<<endl;}
};

int main()
{
    Point p;
    p.x = 10;
    p.y = 20;

    void (Point::* pFunc)() = &Point::Print;
    (p.*pFunc)();
    return 0;
}

原創文章,作者:YWWF,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/149337.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YWWF的頭像YWWF
上一篇 2024-11-04 17:50
下一篇 2024-11-04 17:50

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和算法 C語言貪吃蛇主要運用了以下數據結構和算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25

發表回復

登錄後才能評論