编译多源文件时未解决的外部问题

Unresolved external issue when compiling multi-source files

本文关键字:外部 问题 未解决 源文件 编译      更新时间:2023-10-16

我有一个项目,由两个CPP文件(main.CPP和Car.CPP)和一个头文件(Car.h)组成。该程序旨在允许用户输入汽车的型号、品牌和速度,并显示修改后的速度。我的问题是,当我编译项目时,我收到一个"1个未解决的外部"问题,如下所示:

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Car::Car(void)" (??0Car@@QAE@XZ) referenced in function _main
1>C:UsersShaidiDesktopClassesCIST 2362ProjectsmainDebugmain.exe : fatal error LNK1120: 1 unresolved externals

这是主.cpp文件:

// main.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Car.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string make;
    int model, speed;
    Car c;
    //user input and assignment for make, model, and speed
    cout << "Enter the make of the car: " <<endl;
    cin >> make;
    c.setMake(make);
    cout << "Enter the model of the car: " <<endl;
    cin >> model;
    c.setYearModel(model);
    cout << "Enter the speed of the car: " <<endl;
    cin >> speed;
    c.setSpeed(speed);
    //print make and model
    cout << "Car make: " << c.getMake() <<endl;
    cout << "Car model: " << c.getYearModel() << endl;
    cout << "Car speed: " << c.getSpeed() <<endl;
    //loops to calculate and print acceleration and braking
    for (int i = 0; i < 5; i ++){
        cout << "Car speed after acceleration: " <<c.accelerate() <<endl;
    }
    for (int i = 0; i < 5; i ++){
        cout << "Car speed after braking: " <<c.brake() <<endl;
    }
    return 0;
} //end main

这是Car.cpp文件:

// Car.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Car.h"
#include <cstdlib>
#include <string>
#include <iostream>
using namespace std;
Car::Car(int y, string m)
{
    string make = m;
    int year = y;
    speed = 0;
}
void Car::setYearModel(int y)
{
    yearModel = y;
}
void Car::setSpeed(int s)
{
    if (s >= 0){
        speed = s;
    } else {
        cout << "Invalid speed";
        exit(EXIT_FAILURE);
    }
}
void Car::setMake(string m)
{
    make = m;
}
int Car::getYearModel()
{
    return yearModel;
}
int Car::getSpeed()
{
    return speed;
}
string Car::getMake()
{
    return make;
}
int Car::accelerate()
{
    return speed + 5;
}
int Car::brake()
{
    return speed - 5;
}

这是Car.h文件:

#ifndef CAR_H
#define CAR_H
#include <string>
using namespace std;
class Car 
{
private:
    std::string make;
    int yearModel;
    int speed;
public:
    Car();
    Car(int, std::string);
    void setYearModel(int);
    void setSpeed(int);
    void setMake(std::string);
    int getYearModel() ;
    int getSpeed() ;
    int accelerate() ;
    int brake() ;
    std::string getMake() ;
}; 
#endif // CAR_H

您错过了Car()默认构造函数的实现。

class Car
{
public:
   // There is no implementation.
   Car();
}

您已经声明了Car::Car(),但从未定义过它。可以向.cpp文件添加定义,也可以从标头中删除声明。

例如:

Car::Car()
{
}

看起来你已经定义了car的默认构造函数,但还没有实现它。然后你声明了一个类型为car的变量,该变量需要实现它。将Kerrek上面的代码添加到.cpp文件中就可以了:)