2014-02-27 24 views
2

有一個名爲main.cpp的C++文件。在C++中重寫來自調用者源文件的函數

的main.cpp

#include "addition.h" 
#include <iostream> 
int main(){ 
    int x=2; 
    int y=3; 
    std::cout<<getsum(x,y); 
} 

此文件包括稱爲addition.h自定義首部文件

addition.h

#include "my_adders.h" 
namespace{ 
int getsum(int a,int b){ 
    return calculate_addition_h(a,b); 
} 
} 

my_adders.h

#include <maths.h> 
int calculate_addition_h(int p, int q){ 

     int sum=0; 
     //Fn definitions 
     return sum; 
} 

在main.cpp中, 我需要重寫calculate_addition_h函數的定義。

可能嗎?

我試着複製calculate_addition_h定義以及main.cpp中的聲明。但是,當我打印o/p時,調用my_adders.h中的calculate_addition_h方法,而不是main.cpp中的方法。

請注意:我無法對addition.h或my_adders.h進行任何更改。

任何幫助表示讚賞!

+0

@Andreas Grapentin:編輯。謝謝 –

+0

我想你可以把你自己的版本放在一個單獨的命名空間中(例如'namespace overridden_​​adders'),然後通過'using'語句強制使用它。 – CompuChip

+0

我以爲命名空間關鍵字採取了一個參數? –

回答

0

由於您正在使用全局函數,因此無法重寫該函數,因爲它可以在class中完成。它更好地定義一個不同的內部具有相同名稱的新功能namespace

2

原來,可以不改變任何標題和預處理器魔術!

由於您getsum是一位不願透露姓名的命名空間,可以在無名命名空間定義calculate_addition_h功能包括addition.h:

的main.cpp

namespace 
{ 
    int calculate_addition_h(int p, int q) 
    { 
     return 666; 
    } 
} 

#include "addition.h" 
#include <iostream> 
int main(){ 
    int x=2; 
    int y=3; 
    std::cout<<getsum(x,y); 
} 

在C++中,函數在相同的命名空間中優先於父命名空間中的函數。在這種情況下,父命名空間是全局命名空間。