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

时间:2019-07-13 15:47:53

标签: c++

因此,我尝试访问在另一个类中定义的方法,并且该方法的标头包含在标题中。我很肯定我定义了它,但是它不断弹出未定义的对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

1 个答案:

答案 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的一部分。您应该改为说“在另一个文件中定义”或“在另一个翻译单元中定义”