【问题标题】:How to define class constructor outside class in another file?如何在另一个文件中定义类外部的类构造函数?
【发布时间】:2020-04-01 09:57:30
【问题描述】:

所以,我有一个类 Car:

car.h

#ifndef CAR_H
#define CAR_H

#include <iostream>
#include <string.h>
#include "car.cpp"

// Car class with its attributes
class Car {
  public:
    std::string brand;   
    std::string model;
    int year;

    // Constructor
    Car(int year, std::string model, std::string brand);
};

#endif

我想在另一个 .cpp 文件中的类之外创建一个类构造函数定义:

car.cpp

#include <string.h>

Car::Car(int year, std::string model, std::string brand)
{
  this->brand = brand;
  this->model = model;
  this->year = year;
}

我试图编译,但是出现了这个错误:

car.cpp:3:1: error: ‘Car’ does not name a type

为什么会发生以及如何解决?

我的 main.cpp:

#include <iostream>
#include "car.h"

using namespace std;

int main() {
  // Create an object of Car
  Car carObj1 = Car(1992, "model X", "Brand1");

  // Create another object of Car
  Car carObj2 = Car(2003, "model Y", "Brand2");

  // Print attribute values
  cout << carObj1.brand << " " << carObj1.model << " " << carObj1.year << "\n";
  cout << carObj2.brand << " " << carObj2.model << " " << carObj2.year << "\n";
  return 0;
}

【问题讨论】:

  • [OT]: #include &lt;string.h&gt; -> #include &lt;string&gt;
  • car.cpp 需要 #include "car.h" 以便编译器在定义其构造函数之前可以看到 Car 的定义。如果编译器无法查看类定义,则无法定义(也称为实现)类的任何成员函数。

标签: c++


【解决方案1】:

你得到了包含错误的方式。 car.cpp 应该#include "car.h" 而不是相反。

std::string 的正确头文件是 &lt;string&gt; 而不是 &lt;string.h&gt;

另外,成员初始化最好用初始化列表而不是赋值来完成

Car::Car(int year, std::string model, std::string brand) :
    brand(brand), model(model), year(year)
{
}

【讨论】:

  • 另外,在car.h中不需要car.cpp
【解决方案2】:
#include "car.cpp"

这是错误的。永远不要包含源文件。

‘Car’ does not name a type

为什么会这样

car.cpp 尝试使用尚未定义的类Car

如何解决?

#include "car.h" 添加到car.cpp 以在使用前定义Car。然后从 car.h 中删除 #include "car.cpp" 以避免递归包含会妨碍正确的包含顺序。

【讨论】:

  • 好的,谢谢,现在成功了。我应该立即询问 StackOverflow,因为我处理这个错误 1 ​​小时。但最后,我学到了一些东西。
猜你喜欢
  • 1970-01-01
  • 2015-12-14
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2011-12-27
相关资源
最近更新 更多