2015-02-10 104 views
-4

以下是我的情況:如何訪問與全局函數具有相同功能簽名的類中的全局函數?

file.h此文件包含兩個函數的extern

extern int add(int a, int b); 
extern int sub(int a, int b); 

file.cpp的上述功能實現。

int add(int a, int b) 
{ 
    return 20; 
} 

int sun(int a, int b) 
{ 
    return 20; 
} 

test.h這是類測試,其中在file.h

class test 
{ 
    public: 
      test(); 
      ~test(); 
    private: 
     int add(int a, int b); 
     int sub(int a, int b); 
} 

TEST.CPP在測試類的實施以相同的簽名爲extern添加和子兩個成員函數調用測試類構造函數add函數以及包含這兩個文件。

#include "test.h" 
#include "file.h" // Contains extern methods 
#include <iostream> 

test::test() 
{ 
    int addition = add(10, 10); 
    printf("Addition: %d ", addition); 
} 

int 
test::add(int a, int b) 
{ 
    return 10; 
} 

int 
test::sub(int a, int b) 
{ 
    return 10; 
} 

的main.cpp

#include "test.h" 
int main() 
{ 
    test *a = new test(); 
} 

現在我的問題是,在主類什麼都會被打印出來。是否將打印

它給出輸出爲 此外:10 爲什麼它給10class test使用自己的功能add()sub()。因爲這兩個函數都出現在file.h和同一類中。我的猜測是它會給ambiguity的功能。請問有沒有任何標準,請解釋一下。和我怎樣才能使用012.h在class test file.h函數。

+0

顯然編譯錯誤,因爲你想爲指針類型分配給非指針類型在這裏:'測試=新的測試();' – greatwolf 2015-02-10 12:26:35

+0

什麼都不會打印。即使它編譯了,你也不會執行任何打印任何東西的東西。只需糾正,編譯並執行它。 – rubikonx9 2015-02-10 12:27:15

+5

編譯程序並運行它的機率非常好,將提供一個答案。 – molbdnilo 2015-02-10 12:30:52

回答

1

調用add裏面的test類將使用add成員函數。

要調用全局add功能使用global scope resolution operator ::

int addition = ::add(10, 10); 
+0

謝謝!你可以給我鏈接,我可以得到這個文件。 – 2015-02-10 13:05:05

+1

@ D'JayPatil抓住[好書](http://stackoverflow.com/q/388242/1782465)並閱讀它。行爲在C++標準中有描述,但大多數人不想閱讀*。* – Angew 2015-02-10 13:07:12

+0

@ D'JayPatil找不到官方文檔,但在我的回答中添加了一個到SO問題的鏈接。 – emlai 2015-02-10 13:10:05

1

使用也能做到這一點使用的命名空間。 在file.h

#include "file.h" 
namespace file 
{ 
    int add(int a, int b) 
    { 
     return 20; 
    } 

    int sub(int a, int b) 
    { 
     return 20; 
    } 
} 

在TEST.CPP

#include "test.h" 
#include "file.h" 
#include <iostream> 

test::test() 
{ 
    int addition = file::add(10, 10); // used namespace here 
    printf("Addition: %d ", addition); 
} 

int 
test::add(int a, int b) 
{ 
    return 10; 
} 

int 
test::sub(int a, int b) 
{ 
    return 10; 
} 
+0

使用命名空間我可以有多個具有相同簽名的函數。對吧Uday – 2015-02-10 13:27:54

+1

是的你是對的。 – Uday 2015-02-10 13:35:43