5

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

创建 5 个文件。驱动程序.cpp、fh、f.cpp、gh、g.cpp。f 和 g 应该实现一个名为 hello 的函数。司机应该从 f 和 g 打招呼。

示例输出:

来自f的你好

来自g的你好

按任意键继续 。. .

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

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

4

2 回答 2

17

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

  1. 重载的函数可以具有相同的名称,只要它们的参数在某些方面有所不同。例如,您可以让每个hello()函数接受一个在不同版本之间不同的参数(注意:我不是在建议这种方法)。例如:

    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(); }
    

我不知道你的老师实际上是在追求这些版本中的哪一个。但是,每个都有其用途,了解不同的变化很有用。

如果有人声称为了完整性我应该包含virtual函数:请注意,重写函数实际上也创建了重载(virtual基函数和重写函数在隐式传递的对象中不同),即virtual函数的使用已经覆盖。

于 2013-10-26T19:00:12.057 回答
2

您应该使用命名空间:

fh

namespace mynamespace {
  void hello(); 
}

f.cpp

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

main()

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

有关名称空间的良好介绍。命名空间

于 2013-10-26T19:06:33.953 回答