对已定义方法的未定义引用

Undefined reference to a defined method

本文关键字:未定义 引用 方法 定义      更新时间:2023-10-16

所以我试图访问在另一个类中定义的方法,并在标题中具有原型。我很肯定我定义了它,但它不断弹出对 SafeCracker 的未定义引用。

主.cpp

#include <iostream>
#include "mystuff.h"
using namespace std;
void BigDog(int KibblesCount);
int main()
{
cout << SafeCracker(1);
return 0;
}

我的东西.cpp

#include <iostream>
using namespace std;
string SafeCracker(int SafeID)
{
return "123456";
}

mystuff.h

using namespace std;
#ifndef MYSTUFF_H_INCLUDED
#define MYSTUFF_H_INCLUDED
string SafeCracker(int SafeID);

#endif // MYSTUFF_H_INCLUDED

在这里,它告诉你你有一个未定义的引用,所以你对原型没有真正的问题。
如果您忘记包含包含原型的头文件,您会得到类似

main.cpp: In function ‘int main()’:
main.cpp:8:13: error: ‘SafeCracker’ was not declared in this scope
cout << SafeCracker(1);

未定义的引用是链接器错误。最可能的原因是您在编译时没有使用mystuff.cpp

如果从命令行编译,则应将这两个文件作为参数。
如果使用调用编译器的 IDE,请确保该文件是项目的一部分。

例如,在Code::Blocks中右键单击文件名并转到"添加到项目"(如果我没记错的话)

也有可能您在mystuff.cpp的函数声明中输入了拼写错误(尽管这里似乎并非如此)


现在,您应该注意有关代码的重要事项:

using namespace放在头文件中是非常不好的做法。

.cpp源文件中using namespace std;主要由您决定,并且该语句using仅适用于该特定文件。
但是,如果您将其放在要通过#include包含的头文件中,则using将被强制用于包含它的任何代码。

下面是一个示例:
main.cpp

#include <iostream>
// including mystuff.h to use that awesome SafeCracker()
#include "mystuff.h"
// I need to use an std::map (basically an associative array)
#include <map>
// the map of my game
class map
{
int tiles[10][10];
};
int main()
{
// The std map I need to use
std::map<int, int> mymappedcontainer;
// The map of my game I need to use
map mytiles;
// The reason why I need to include mystuff.h
cout << SafeCracker(1);
return 0;
}

通常,我的class map应该不是问题,因为我从标准库中包含的map位于命名空间std内,因此要使用它,您需要std::map
这里的问题是,由于mystuff.h已经using namespace std;,符号map已经被使用,这会产生冲突。

您现在不知道谁将使用您的头文件,或者您是否将在很长一段时间内再次使用它们,也许那时您将需要使用已在 std 命名空间中使用的名称。
我建议您在从标准库中获取内容之前使用std::而不是(例如std::string而不仅仅是string)


PS:在C++中,"类"指的是class的数据结构,您在此处创建的函数不属于任何class。您应该说"在另一个文件中定义"或"在另一个翻译单元中定义">