我想制作一个程序,它将在3个文件中。 “Persona.hpp”“Persona.cpp”“main.cpp”我不确定它是怎么做的。
这是“Persona.hpp”
#ifndef __PERSONA_HPP
#define __PERSONA_HPP
#include <string>
using namespace std;
class Persona{
public:
Persona();
void setNombre(string N);
void setFechaNac(string F);
void setPeso(float P);
void setEstatura(float E);
string getNombre(void);
string getFechaNac(void);
float getPeso(void);
float getEstatura(void);
void mostrarDat(void);
private:
string nombre;
string fechaNac;
float peso;
float estatura;
};
#endif
“Persona.cpp”
#include "Persona.hpp"
#include <iostream>
#include <string>
using namespace std;
Persona::Persona(){
nombre = "";
fechaNac = "";
peso = estatura = 0;
}
void Persona::setNombre(string N){
nombre = N;
}
void Persona::setFechaNac(string F){
fechaNac = F;
}
void Persona::setPeso(float P){
peso = (P>1 && P<500) ? P : 0;
}
void Persona::setEstatura(float E){
estatura = (E>30 && E<280) ? E : 0;
}
string Persona::getNombre(void){
return nombre;
}
string Persona::getFechaNac(void){
return fechaNac;
}
float Persona::getPeso(void){
return peso;
}
float Persona::getEstatura(void){
return estatura;
}
void Persona::mostrarDat(){
cout << "\nNombre: " << getNombre();
cout << "\nFecha de nacimiento: " << getFechaNac();
cout << "\nPeso: " << getPeso() << " Kg";
cout << "\nEstatura: " << getEstatura() << " Cm";
}
“的main.cpp”:
#include "Persona.hpp"
#include <iostream>
using namespace std;
int main(){
Persona humano;
cout << "\nConstructor default: ";
humano.mostrarDat();
humano.setNombre("Jose Ramon Garibay Alvarez");
humano.setFechaNac("27 Octubre de 1989");
humano.setPeso(80);
humano.setEstatura(175.5);
cout << "\n\nEstableciendo datos validos: ";
humano.mostrarDat();
humano.setNombre("Karina Nogueira Briseno");
humano.setFechaNac("15 Agosto de 1985");
humano.setPeso(0.457);
humano.setEstatura(17);
cout << "\n\nEstableciendo datos Invalidos: ";
humano.mostrarDat();
return 0;
}
首先我收到错误:http://oi40.tinypic.com/2v96quo.jpg 而且我不知道我是否正确地做了“#including”文件。我记得我的profesor正在使用类似“#ifndef SOMETHING”的东西,但我不知道是否有必要,谢谢你的回答! :)
答案 0 :(得分:2)
使用#include "Persona.hpp"
代替#include <Persona.hpp>
答案 1 :(得分:1)
看起来你的包含目录设置错误了。
此外,您基本上将标题包含在“错误”的方式中,这也可能是原因:
#include "header.h"
:在查找特定的头文件时,首先查看当前的代码目录(即cpp文件所在的位置)。
#include <header.h>
:首先查看您的系统/预定义包含目录。
但是,根据您的编译器(s)设置,它的版本等,可能没有任何区别(除非您有相互冲突的文件名)。始终遵循预定的路线绝对是一个好主意:
使用#include "..."
包含位于源目录中某处的头文件。使用#include <...>
包含应在您正在编译的计算机上安装的其他标头(即外部依赖项)。
添加了关于包含警戒的说明(使用#ifndef
和#define
或#pragma once
):这些应该用于防止在同一个翻译单元中多次包含头文件,例如如果两个不同的其他标题包含相同的头文件,则最终会重新定义变量,结构,类等。
包含防护是一种防止此行为的简单方法;你只需要确保使用一个足够独特的宏。
一个基本的包含守卫可能就像这样简单:
#ifndef MY_CUSTOM_HEADER_FILE
#define MY_CUSTOM_HEADER_FILE
// Your header file code
#endif
但是,您可能会同意这可能相当麻烦,理论上容易出错,例如:如果有人选择常见字词或名称,例如CUSTOMER
或CUSTOMER_H
。因此,几乎任何现代预处理器都会接受编译指令#pragma once
。如果该行在头文件中(并且处于活动状态),编译器将确保它不会被包含多次:
#pragma once
// Your header file code
答案 2 :(得分:0)
如果源文件和头文件有不同的目录,请确保找到正确的目录。您可能需要更改目录:
#include "../Headers/Persona.hpp"
答案 3 :(得分:0)
为了在OOPS中使用更好的编程方法,请始终在.h或.hpp文件中使用#ifndef指令。 像这样开始你的.hpp。
#ifndef __PERSONA_HPP
#define __PERSONA_HPP
并在文件的末尾加上这一行
#endif
这会处理很多事情并避免多次包含头文件。
答案 4 :(得分:0)
我记得我的教授正在使用像“#ifndef SOMETHING”这样的东西,但我不知道是否有必要,
#ifndef
是一名头球卫士。这不是导致问题的原因,但这里是如何使用它们的。你把它们放在标题的顶部,如下所示:
#ifndef SOMETHING_H
#define SOMETHING_H
并在标题的末尾添加:
#endif
它基本上意味着每个标题只包含一次。如果你没有头部防护,你可能会遇到问题。
例如,如果A.cpp
和B.cpp
都#include "header.h"
,那么当编译器编译第二个时,你将会遇到很多错误,例如“并且 - 这样的类已经被定义为“或”这样的变量已被定义“。
但是如果你有一个标题保护,那么当它第二次尝试包含标题时#ifndef
将会失败,因为SOMETHING_H
已经定义了(当它第一次包含标题时) 。因此它将跳过整个文件,直到它到达#endif
并且您不会多次声明变量。
如果你现在只做小项目,这对你来说可能不会有问题,但强烈建议你进入这个项目。