C++ C++;地点包括
我有一类车辆(Vehicle.h和Vehicle.cpp)。如果我没有将include放在头文件中,VisualStudio会给我错误。为什么会这样?在我之前的两次作业中,我将include放在.cpp文件中,没有任何问题。以下是我想工作但不是的: 车辆.h:C++ C++;地点包括,c++,include,C++,Include,我有一类车辆(Vehicle.h和Vehicle.cpp)。如果我没有将include放在头文件中,VisualStudio会给我错误。为什么会这样?在我之前的两次作业中,我将include放在.cpp文件中,没有任何问题。以下是我想工作但不是的: 车辆.h: #ifndef VEHICLE_H #define VEHICLE_H using namespace std; class Vehicle { public: Vehicle(); Vehicle(string mfr
#ifndef VEHICLE_H
#define VEHICLE_H
using namespace std;
class Vehicle
{
public:
Vehicle();
Vehicle(string mfr, int cylinders, Person owner);
string getManufacturer();
int getNumOfCylinders();
Person getOwner();
private:
string manufacturer;
int numOfCylinders;
Person owner;
};
#endif
vehicle.cpp:
#include <iostream>
#include <string>
using namespace std;
#include "person.h"
#include "vehicle.h"
Vehicle::Vehicle()
{
//Initialize with defaults
}
Vehicle::Vehicle(string mfr, int cylinders, Person owner)
{
//Initialize with parameters
}
string Vehicle::getManufacturer()
{
return manufacturer;
}
int Vehicle::getNumOfCylinders()
{
return numOfCylinders;
}
Person Vehicle::getOwner()
{
return owner;
}
truck.cpp:
#include "person.h"
#include "vehicle.h"
//implement truck here
几个错误,例如:
错误C2061:语法错误:标识符“字符串”
错误C2146:语法错误:缺少“;”在标识符“getManufacturer”之前
错误C2061:语法错误:标识符“字符串”
错误C2535:'Person::Person(void)':成员函数已定义或声明错误C2146:语法错误:缺少“;”在标识符“get_name”之前 错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认INT/P> 错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认INT/P>
错误C2146:语法错误:缺少“;”在标识符“getDriverLicenseNo”之前,您正在车辆头文件中声明
Person
的实例,因此编译器需要完整声明。如果您使用的是指向某人的指针或引用,那么只需使用类person转发声明即可代码>
编辑:同样,使用名称空间std去掉编码>并在变量前面加上std::
。这将在将来避免很多球的疼痛
EDIT2:您还需要在头文件中包含
好了,我要试着保持它的简洁
当编译器处理您的实现文件(.cpp)时,它包括您指定的标题(在本例中,将是vehicle.h
和person.h
)。对于每个实现文件,编译器都需要了解您使用的每种类型,以便生成正确的代码
当它处理一个包含文件时,它仍然需要知道一切。因此,在vehicle.h
头文件中,您使用的是Person
。在编译器遇到这个问题时,它需要知道如何构造person。您的vehicle.cpp
包括person.h
在vehicle.h
之前,因此,没有问题用于车辆.cpp
。任何包含vehicle.h
但不包含person.h
的其他内容都会导致编译器错误
那么,什么时候可以使用前向声明和用户指针或引用
声明指针或引用不需要在头文件中告诉编译器有关该类或结构的任何信息。您只是告诉编译器您有这样做的意图。如果该类是向前声明的:
class Person;
然后编译器说“okee dokee,我接受这个。”然后在实现中包含相关文件,编译器明白了你的意思,每个人都从酒吧走回家
我认为,在您的案例中,车辆的实现文件在纸面上看起来不错,但其他内容包括vehicle.h
,并且没有关于人的线索
您的解决方案
如果必须,在vehicle.h
中包含person.h
,否则将该构造函数更改为引用person(和成员),并向前声明person
。然而,由于不知道您的程序在做什么,我不能说即使通过引用传递也是正确的
请使用名称空间std删除编码>并将字符串更改为std::string
:)您正在车辆头文件中声明Person
的实例,因此编译器需要完整声明。如果您使用的是指向某人的指针或引用,那么只需使用类person转发声明即可代码>
编辑:同样,使用名称空间std去掉编码>并在变量前面加上std::
。这将在将来避免很多球的疼痛
EDIT2:您还需要在头文件中包含
好了,我要试着保持它的简洁
当编译器处理您的实现文件(.cpp)时,它包括您指定的标题(在本例中,将是vehicle.h
和person.h
)。对于每个实现文件,编译器都需要了解您使用的每种类型,以便生成正确的代码
当它处理一个包含文件时,它仍然需要知道一切。因此,在vehicle.h
头文件中,您使用的是Person
。在编译器遇到这个问题时,它需要知道如何构造person。您的vehicle.cpp
包括person.h
在vehicle.h
之前,因此,没有问题用于车辆.cpp
。任何包含vehicle.h
但不包含person.h
的其他内容都会导致编译器错误
那么,什么时候可以使用前向声明和用户指针或引用
声明指针或引用不需要在头文件中告诉编译器有关该类或结构的任何信息。您只是告诉编译器您有这样做的意图。如果该类是向前声明的:
class Person;
然后编译器说“okee dokee,我接受这个。”然后在实现中包含相关文件,编译器明白了你的意思,每个人都从酒吧走回家
我认为,在您的案例中,车辆的实现文件在纸面上看起来不错,但其他内容包括vehicle.h
,并且没有关于人的线索
您的解决方案#include "person.h"
#include "vehicle.h"
//implement truck here
class Person;