所以我试图访问一个在另一个类中定义的方法,并且在头文件中有原型。我很肯定我定义了它,但它不断弹出对 SafeCracker 的未定义引用。
主程序
#include <iostream>
#include "mystuff.h"
using namespace std;
void BigDog(int KibblesCount);
int main()
{
cout << SafeCracker(1);
return 0;
}
mystuff.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
放在头文件中是非常糟糕的做法。using namespace std;
在.cpp
源文件主要是你的,而且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;
}
通常, myclass map
应该不是问题,因为map
I 从标准库中包含在 namespace 内std
,因此要使用它,您需要转到std::map
.
这里的问题是,因为 mystuff.h 已经using namespace std;
在里面了,这个符号map
已经被使用了,这就产生了冲突。
你现在不知道谁会使用你的头文件,或者你是否会在很长一段时间内再次使用它们,也许那时你会想要使用已经在 std 命名空间中使用的名称。
我建议你std::
在从标准库中获取的东西之前使用(std::string
而不是仅仅string
作为例子)
PS:在 C++ 中,“class”指的是一种class
数据结构,你在这里做的函数不属于任何class
. 你应该说“在另一个文件中定义”或“在另一个翻译单元中定义”
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句