对于我的作业,这是我的任务:
创建5个文件。 Driver.cpp,f.h,f.cpp,g.h,g.cpp。 f和g应该实现一个名为hello的函数。司机应该 从f和g打电话给你。
示例输出:
你好,来自f
你好,来自g
按任意键继续。 。
我创建了所有这些文件,但我不明白的是,如何在两个文件中存在相同的函数hello()并从driver.cpp文件调用?任何帮助将不胜感激!
编辑:我得到的错误是“致命错误LNK1169:找到一个或多个多重定义的符号”。这是指两个hello()函数。我该如何解决这个问题?
答案 0 :(得分:16)
允许全局可见的实体只有一个定义。因此,您不能在多个翻译单元中定义相同的函数hello()
。如何多次定义同名函数有几种不同的方法:
重载函数可以具有相同的名称,只要它们的参数在某种程度上不同即可。例如,您可以让每个hello()
函数采用不同版本之间不同的参数(注意:我不是建议这个approch)。例如:
void hello(bool) { std::cout << "hello(bool)\n"; }
void hello(int) { std::cout << "hello(int)\n"; }
您可以在不同的命名空间中定义名称。这使得完全限定的名称实际上不同,即仅通过使用不同的范围来防止冲突,例如:
namespace a { void hello() { std::cout << "a::hello()\n"; }
namespace b { void hello() { std::cout << "b::hello()\n"; }
假设您从本地文件中的函数调用函数,您可以使用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
函数,并且覆盖函数在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