在C ++中调用来自调用者源文件的函数

时间:2014-02-27 11:15:24

标签: c++

有一个名为main.cpp的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进行任何更改。

感谢任何帮助!

2 个答案:

答案 0 :(得分: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 ++中,同一名称空间中的函数优先于父名称空间中的函数。在这种情况下,父命名空间是全局命名空间。

答案 1 :(得分:0)

当您使用全局函数时,无法覆盖该函数,因为它可以在class中完成。最好在不同的namespace

中定义具有相同名称的新函数