因此,我试图访问一个在另一个类中定义并在标头中包含原型的方法。我非常肯定,我定义了它,但是它总是出现对SafeCracker的未定义的引用。
Main.cpp
#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发布于 2019-07-13 16:41:34
这里它告诉您,您有一个未定义的引用,因此您对原型没有真正的问题。
如果您忘记包含包含原型的头文件,您就会得到以下内容
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::Block中,右键单击文件名,然后转到“”(如果我没有记错)
您还可能在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;
}通常,我的class map不应该是一个问题,因为我从标准库中包含的map是在名称空间std中,所以要使用它,您需要使用std::map。
这里的问题是,由于mystuff.h中有using namespace std;,所以已经使用了符号map,这就产生了冲突。
您现在不使用您的头文件,或者如果您将在很长一段时间后再次使用它们,那么您可能希望使用已在std命名空间中使用的名称。
我建议您在使用标准库之前使用std:: (例如,std::string而不是string )。
PS:在C++中,"class“指的是class数据结构,您在这里创建的函数不是任何class的一部分。您应该说“在另一个文件中定义”或“在另一个翻译单元中定义”。
https://stackoverflow.com/questions/57020638
复制相似问题