未定义对类构造函数h文件的引用

问题描述

我对一个程序有多个类,并且已经修复了所有错误,但是当我尝试编译时,它现在显示出对`event :: event(std :: __ cxx11 :: basic_string ,std :: __ cxx11 :: basic_string ,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向量在函数中被声明为参数。

解决方法

问题不是.h可能不是您没有链接实现该功能的正确.o或库,或者您没有该功能的实现,或者干脆不编译.cpp

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

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

某些可能的原因(更频繁):

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

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

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

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

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

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

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

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

请考虑以下两个C ++程序。在第一个文件中,我们使用第二个文件中定义的“ print()”函数。当我们分别编译这些文件时,第一个文件为打印功能提供“未定义参考”,而第二个文件为主要功能提供“未定义参考”。

#4)项目类型错误

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

#5)没有库

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

#6)依赖文件未编译

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

除上述原因外,在许多其他情况下也会发生“未定义参考”错误。但最重要的是,程序员犯了错,为了防止出现此错误,应予以纠正。