两个不同的CPP文件中的相同功能。我该如何做到这一点?

时间:2013-10-26 18:37:30

标签: c++ header-files

对于我的作业,这是我的任务:

创建5个文件。 Driver.cpp,f.h,f.cpp,g.h,g.cpp。 f和g应该实现一个名为hello的函数。司机应该 从f和g打电话给你。

示例输出:

你好,来自f

你好,来自g

按任意键继续。 。

我创建了所有这些文件,但我不明白的是,如何在两个文件中存在相同的函数hello()并从driver.cpp文件调用?任何帮助将不胜感激!

编辑:我得到的错误是“致命错误LNK1169:找到一个或多个多重定义的符号”。这是指两个hello()函数。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:16)

允许全局可见的实体只有一个定义。因此,您不能在多个翻译单元中定义相同的函数hello()。如何多次定义同名函数有几种不同的方法:

  1. 重载函数可以具有相同的名称,只要它们的参数在某种程度上不同即可。例如,您可以让每个hello()函数采用不同版本之间不同的参数(注意:我不是建议这个approch)。例如:

    void hello(bool) { std::cout << "hello(bool)\n"; }
    void hello(int)  { std::cout << "hello(int)\n"; }
    
  2. 您可以在不同的命名空间中定义名称。这使得完全限定的名称实际上不同,即仅通过使用不同的范围来防止冲突,例如:

    namespace a { void hello() { std::cout << "a::hello()\n"; }
    namespace b { void hello() { std::cout << "b::hello()\n"; }
    
  3. 假设您从本地文件中的函数调用函数,您可以使用static关键字将函数从全局可见移动到仅在本地可见。具有本地可见性的函数不会在不同的翻译单元之间例如:

    // file a.cpp
    static void hello() { std::cout << "a.cpp:hello()\n"; }
    void a() { hello(); }
    
    // file b.cpp
    static void hello() { std::cout << "b.cpp:hello()\n"; }
    void b() { hello(); }
    
  4. 我的教导实际上是哪些版本,我不知道。但是,每个人都有自己的用途,了解不同的变化很有用。

    如果有人声称为了完整性我应该包含virtual函数:请注意,覆盖函数实际上也会创建一个重载(基础中的virtual函数,并且覆盖函数在implicity传递对象),即已经涵盖了virtual函数的使用。

答案 1 :(得分:1)

您应该使用名称空间:

f.h

namespace mynamespace {
  void hello(); 
}

f.cpp

void mynamespace::hello()
{
    /... function definition here
}

main()

int main()
{
   mynamespace :: hello();   // calls hello defined in f.cpp
}

有关名称空间的详细介绍。 Namespaces