因此,我尝试访问在另一个类中定义的方法,并且该方法的标头包含在标题中。我很肯定我定义了它,但是它不断弹出未定义的对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
答案 0 :(得分:0)
在这里它告诉您您有未定义的引用,因此您对原型确实没有问题。
如果您忘了包含包含原型的头文件,您将得到类似
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;
}
通常,我的class map
应该不会有问题,因为我从标准库中包含的map
位于命名空间std
内部,因此要使用它,您需要转到{{ 1}}。
这里的问题是,由于mystuff.h中包含std::map
,因此符号using namespace std;
已经被使用,并且会产生冲突。
您现在不打算由谁来使用头文件,或者如果很长一段时间以后您将再次使用它们,那么也许您将想要使用std命名空间中已经使用的名称。
我建议您在从标准库中获取内容之前,先使用map
(例如,std::
而不是std::string
)
PS:在C ++中,“类”指的是string
数据结构,您在此处创建的函数不属于任何class
的一部分。您应该改为说“在另一个文件中定义”或“在另一个翻译单元中定义”