亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問板塊 發(fā)新帖
查看: 3593 | 回復(fù): 10
打印 上一主題 下一主題

請(qǐng)問:這里typedef是什么用法? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2006-11-06 17:43 |只看該作者 |倒序?yàn)g覽
typedef polygon* create_t();
typedef void destroy_t(polygon*);

create_t*,destroy_t*代表什么?

能否去掉typedef ,改寫一下?謝謝!
--------------------------------------------

補(bǔ)充一下,只見到這種用法
--------------------------------------------------------
ypedef 定義函數(shù)指針
jiahui1105 發(fā)表于 2006-8-26 12:33:00

關(guān)于C++中函數(shù)指針的使用(包含對(duì)typedef用法的討論)
(一)簡(jiǎn)單的函數(shù)指針的應(yīng)用。
//形式1:返回類型(*函數(shù)名)(參數(shù)表)
char (*pFun)(int);
char glFun(int a){ return;}
void main()
{
    pFun = glFun;
    (*pFun)(2);
}
        第一行定義了一個(gè)指針變量pFun。首先我們根據(jù)前面提到的“形式1”認(rèn)識(shí)到它是一個(gè)指向某種函數(shù)的指針,這種函數(shù)參數(shù)是一個(gè)int型,返回值是char類型。只有第一句我們還無法使用這個(gè)指針,因?yàn)槲覀冞未對(duì)它進(jìn)行賦值。
        第二行定義了一個(gè)函數(shù)glFun()。該函數(shù)正好是一個(gè)以int為參數(shù)返回char的函數(shù)。我們要從指針的層次上理解函數(shù)——函數(shù)的函數(shù)名實(shí)際上就是一個(gè)指針,函數(shù)名指向該函數(shù)的代碼在內(nèi)存中的首地址。
        然后就是可愛的main()函數(shù)了,它的第一句您應(yīng)該看得懂了——它將函數(shù)glFun的地址賦值給變量pFun。main()函數(shù)的第二句中“*pFun”顯然是取pFun所指向地址的內(nèi)容,當(dāng)然也就是取出了函數(shù)glFun()的內(nèi)容,然后給定參數(shù)為2。
(二)使用typedef更直觀更方便。
//形式2:typedef 返回類型(*新類型)(參數(shù)表)
typedef char (*PTRFUN)(int);
PTRFUN pFun;
char glFun(int a){ return;}
void main()
{
    pFun = glFun;
    (*pFun)(2);
}
        typedef的功能是定義新的類型。第一句就是定義了一種PTRFUN的類型,并定義這種類型為指向某種函數(shù)的指針,這種函數(shù)以一個(gè)int為參數(shù)并返回char類型。后面就可以像使用int,char一樣使用PTRFUN了。
        第二行的代碼便使用這個(gè)新類型定義了變量pFun,此時(shí)就可以像使用形式1一樣使用這個(gè)變量了。

三)在C++類中使用函數(shù)指針。
//形式3:typedef 返回類型(類名::*新類型)(參數(shù)表)
class CA
{
public:
    char lcFun(int a){ return; }
};
CA ca;
typedef char (CA::*PTRFUN)(int);
PTRFUN pFun;
void main()
{
    pFun = CA::lcFun;
    ca.(*pFun)(2);
}
        在這里,指針的定義與使用都加上了“類限制”或“對(duì)象”,用來指明指針指向的函數(shù)是那個(gè)類的這里的類對(duì)象也可以是使用new得到的。比如:
CA *pca = new CA;
pca->(*pFun)(2);
delete pca;
        而且這個(gè)類對(duì)象指針可以是類內(nèi)部成員變量,你甚至可以使用this指針。比如:
        類CA有成員變量PTRFUN m_pfun;
void CA::lcFun2()
{
   (this->*m_pFun)(2);
}
        一句話,使用類成員函數(shù)指針必須有“->*”或“.*”的調(diào)用。

[ 本帖最后由 jglxgz 于 2006-11-6 17:45 編輯 ]

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2006-11-06 18:58 |只看該作者

回復(fù) 1樓 jglxgz 的帖子

高手吃飯回來沒?
呵呵!

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2006-11-06 19:18 |只看該作者
typedef 就是 typedef,no alternative but it

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2006-11-06 19:23 |只看該作者
原帖由 langue 于 2006-11-6 19:18 發(fā)表
typedef 就是 typedef,no alternative but it


typedef polygon* create_t();
typedef void destroy_t(polygon*);

create_t*,destroy_t*代表什么?

能否去掉typedef ,改寫一下?謝謝!
例如 語(yǔ)句create_t* func; 重新改寫,就用其本來的定義,也就是不通過typedef 來代替,例如如下語(yǔ)句:
typedef  unsigned int UINT;
UNIT a;可以改寫為:unsigned int a;

我想弄清楚:
typedef polygon* create_t();
typedef void destroy_t(polygon*);

create_t*,destroy_t*代表什么?
謝謝!

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2006-11-06 19:28 |只看該作者
typedef polygon* create_t();  
typedef void destroy_t(polygon*);   

typedef的功能是引入一個(gè)類型定義,上面的語(yǔ)句就是定義了create_t和destroy_t這兩個(gè)函數(shù)類型.

create_t*,destroy_t*代表什么?

是指向一個(gè)函數(shù)的指針類型

能否去掉typedef ,改寫一下?謝謝!

去掉typedef后就成了變量定義或函數(shù)聲明.

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2006-11-06 19:45 |只看該作者
當(dāng)然能去掉,不過去掉意義就 完全不一樣了。^_^

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2006-11-06 19:51 |只看該作者
原帖由 coldwarm 于 2006-11-6 19:28 發(fā)表
typedef polygon* create_t();  
typedef void destroy_t(polygon*);   

typedef的功能是引入一個(gè)類型定義,上面的語(yǔ)句就是定義了create_t和destroy_t這兩個(gè)函數(shù)類型.

create_t*,destroy_t*代表什么?

...

create_t*,destroy_t*實(shí)際上是引出的定義,這個(gè)是在so導(dǎo)出class時(shí)遇到的,具體代碼在這:


  1. # This file is part of the C++ dlopen mini HOWTO. You can find the complete
  2. # HOWTO and/or updated versions at
  3. # http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/
  4. #
  5. # Copyright 2002-2006 Aaron Isotton <aaron@isotton.com>
  6. # Licensed under the GNU GPL.

  7. example2: main.cpp polygon.hpp triangle.so
  8.         $(CXX) $(CXXFLAGS) -o example2 main.cpp -ldl

  9. triangle.so: triangle.cpp polygon.hpp
  10.         $(CXX) $(CXXFLAGS) -shared -o triangle.so triangle.cpp

  11. clean:
  12.         rm -f example2 triangle.so

  13. .PHONY: clean
復(fù)制代碼


  1. #include "polygon.hpp"
  2. #include <iostream>
  3. #include <dlfcn.h>

  4. int main() {
  5.     using std::cout;
  6.     using std::cerr;

  7.     // load the triangle library
  8.     void* triangle = dlopen("./triangle.so", RTLD_LAZY);
  9.     if (!triangle) {
  10.         cerr << "Cannot load library: " << dlerror() << '\n';
  11.         return 1;
  12.     }

  13.     // reset errors
  14.     dlerror();
  15.    
  16.     // load the symbols
  17.     create_t* create_triangle = (create_t*) dlsym(triangle, "create");
  18.    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  19.     const char* dlsym_error = dlerror();
  20.     if (dlsym_error) {
  21.         cerr << "Cannot load symbol create: " << dlsym_error << '\n';
  22.         return 1;
  23.     }
  24.    
  25.     destroy_t* destroy_triangle = (destroy_t*) dlsym(triangle, "destroy");
  26. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  27.     dlsym_error = dlerror();
  28.     if (dlsym_error) {
  29.         cerr << "Cannot load symbol destroy: " << dlsym_error << '\n';
  30.         return 1;
  31.     }

  32.     // create an instance of the class
  33.     polygon* poly = create_triangle();
  34. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  35.     // use the class
  36.     poly->set_side_length(7);
  37.         cout << "The area is: " << poly->area() << '\n';

  38.     // destroy the class
  39.     destroy_triangle(poly);

  40.     // unload the triangle library
  41.     dlclose(triangle);
  42. }
復(fù)制代碼


  1. #ifndef POLYGON_HPP
  2. #define POLYGON_HPP

  3. class polygon {
  4. protected:
  5.     double side_length_;

  6. public:
  7.     polygon()
  8.         : side_length_(0) {}

  9.     virtual ~polygon() {}

  10.     void set_side_length(double side_length) {
  11.         side_length_ = side_length;
  12.     }

  13.     virtual double area() const = 0;
  14. };

  15. // the types of the class factories
  16. typedef polygon* create_t();
  17. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  18. typedef void destroy_t(polygon*);
  19. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  20. #endif
復(fù)制代碼


  1. #include "polygon.hpp"
  2. #include <cmath>

  3. class triangle : public polygon {
  4. public:
  5.     virtual double area() const {
  6.         return side_length_ * side_length_ * sqrt(3) / 2;
  7.     }
  8. };

  9. // the class factories
  10. extern "C" polygon* create() {
  11.     return new triangle;
  12. }

  13. extern "C" void destroy(polygon* p) {
  14.     delete p;
  15. }
復(fù)制代碼


麻煩仔細(xì)解釋一下,謝謝!


Sample TextSample Text

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2006-11-06 19:54 |只看該作者
原帖由 高峰 于 2006-11-6 19:45 發(fā)表
當(dāng)然能去掉,不過去掉意義就 完全不一樣了。^_^


能否去掉typedef ,改寫一下?謝謝!
~~~~~~~~~~~~~~~~~~~~~~~
不是去掉,是改寫!

例如 語(yǔ)句create_t* func; 重新改寫,就用其本來的定義,也就是不通過typedef 來代替,例如如下語(yǔ)句:
typedef  unsigned int UINT;
UNIT a;可以改寫為:unsigned int a;

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2006-11-06 19:56 |只看該作者

回復(fù) 1樓 jglxgz 的帖子

請(qǐng)高手仔細(xì)解釋!
        ~~~
謝謝!。!

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2006-11-06 20:16 |只看該作者

  1. polygon* (*createFuncPtr)();這樣就定義了一個(gè)函數(shù)指針類型的變量.
復(fù)制代碼


看了一下你的代碼的頭文件應(yīng)當(dāng)改成


  1. #ifndef POLYGON_HPP
  2. #define POLYGON_HPP

  3. class polygon
  4. {
  5. protected:
  6.         double side_length_;

  7. public:
  8.         polygon()
  9.                 : side_length_(0)
  10.         {
  11.         }

  12.         virtual ~polygon()
  13.         {}

  14.         void set_side_length(double side_length)
  15.         {
  16.                 side_length_ = side_length;
  17.         }

  18.         virtual double area() const = 0;
  19. };

  20. #ifdef __cplusplus        // 通過編譯預(yù)處理宏來使頭文件用戶無論在使用C還是C++編譯器時(shí)
  21. ,共享庫(kù)導(dǎo)出函數(shù)名

  22.                                      //字都是用的是C語(yǔ)言的函數(shù)名字修飾方式
  23. extern "C"
  24. {
  25. #endif // __cplusplus

  26.         typedef polygon* create_t();
  27.         typedef void destroy_t(polygon*);
  28. #ifdef __cplusplus
  29. }
  30. #endif // __cplusplus

  31. #endif //POLYGON_HPP
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP