对类构造函数 h 文件的未定义引用 [重复]

Undefined reference to class constructor h files [duplicate]

提问人:wakanada 提问时间:10/22/2020 最后编辑:wakanada 更新时间:10/22/2020 访问量:2822

问:

我为一个程序设置了多个类,并且已经修复了所有错误,但是当我尝试编译时,它现在显示对“event::event(std::__cxx11::basic_string<char, std::char_traits, std::allocator >, std::__cxx11::basic_string<char, std::char_traits, std::allocator >, int, int)'

我是cpp的新手,无法理解这里发生的事情。其他类也报告了相同的错误。可能是 h 文件中有问题。我在下面粘贴一个,有人可以告诉我如何解决这个问题吗?

#ifndef EVENT_H
#define EVENT_H

#include <string>
#include <iostream>
#include <iomanip>

class event
{
protected:
    std::string location, uniqueFeature;
    double uniFeaFactorT, uniFeaFactorF;

public:
    event(std::string location = "", std::string uniqueFeature = "", int uniFeaFactorT = 0, int uniFeaFactorF = 0);
    double getUFF(bool f);
    std::string getLoc();
    std::string getUF();
};

double event::getUFF(bool f){ return (f) ? uniFeaFactorT : uniFeaFactorF;}

std::string event::getLoc(){ return location;}

std::string event::getUF(){ return uniqueFeature;}

static std::ostream &operator<<(std::ostream &out, event &e)
{
    out << "City: " << e.getLoc() << "\nUnique Feature: " << e.getUF();
}

#endif

通过从文件中读取,在 main 函数中创建对象。我还粘贴了下面的文件读取代码:

std::ifstream fin1(eventFileNm);
std::string lineV;
std::vector<string> v;
while (getline(fin1, lineV))
{
    std::istringstream iss(lineV);
    std::string fieldV;
    while (getline(iss, fieldV, ';'))
    {
        v.push_back(fieldV);
    }

    event *b = new event(v[0], v[1], stoi(v[2]), stoi(v[3]));
    eventvec.push_back(b);
}

eventvec 向量在函数中声明为参数。

C++ C++11 编译器错误 头文件 未定义引用

评论

0赞 Some programmer dude 10/22/2020
在哪个源文件中定义(实现)构造函数?您是否使用该文件构建(更重要的是链接)?并且不要在头文件中定义(实现)函数。
0赞 Shivam Kumar 10/22/2020
编译器可能无法找到定义。查看构造函数是否使用正确的名称定义并编译。

答:

0赞 Zig Razor 10/22/2020 #1

问题不在于 .h 可能您没有链接实现此函数的正确 .o 或库,或者您没有实现该函数,或者根本不编译 .cpp

当我们在程序中引用对象名称(类、函数、变量等)并且链接器尝试在所有链接的对象文件和库中搜索它时找不到它的定义时,就会发生“未定义的引用”错误。

因此,当链接器找不到链接对象的定义时,它会发出“未定义的引用”错误。从定义中可以清楚地看出,此错误发生在链接过程的后期阶段。导致“未定义引用”错误的原因有很多。

一些可能的原因(更常见):

#1) 没有为对象提供定义

这是导致“未定义引用”错误的最简单原因。程序员只是忘记了定义对象。

#2) 使用对象的定义错误(签名不匹配)

“未定义引用”错误的另一个原因是当我们指定错误的定义时。我们在程序中使用任何对象,其定义是不同的。

请考虑以下 C++ 程序。在这里,我们调用了 func1 ()。它的原型是 int func1()。但它的定义与其原型不符。正如我们所看到的,函数的定义包含函数的参数。

因此,当程序编译时,由于原型和函数调用匹配,编译成功。但是,当链接器尝试将函数调用与其定义链接时,它会发现问题并将错误作为“未定义的引用”发出。

#3) 对象文件未正确链接

此问题还可能导致“未定义的引用”错误。在这里,我们可能有多个源文件,我们可以独立编译它们。完成此操作后,对象未正确链接,并导致“未定义的引用”。

请考虑以下两个 C++ 程序。在第一个文件中,我们使用第二个文件中定义的“print()”函数。当我们单独编译这些文件时,第一个文件为 print 函数提供“未定义的引用”,而第二个文件为 main 函数提供“未定义的引用”。

#4) 错误的项目类型

当我们在 C++ IDE(如 Visual Studio)中指定错误的项目类型并尝试执行项目不希望做的事情时,我们会得到“未定义的引用”。

#5) 没有库

如果程序员没有正确指定库路径或完全忘记指定它,那么我们就会从库中获得程序使用的所有引用的“未定义引用”。

#6) 依赖文件未编译

程序员必须确保我们事先编译项目的所有依赖项,以便在我们编译项目时,编译器找到所有依赖项并成功编译。如果缺少任何依赖项,则编译器会给出“未定义的引用”。

除了上面讨论的原因外,在许多其他情况下还可能发生“未定义引用”错误。但底线是程序员把事情弄错了,为了防止这个错误,应该纠正它们。