标题,函数定义,主要在不同的文件中

时间:2014-01-15 08:44:38

标签: c++ oop

我想制作一个程序,它将在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”的东西,但我不知道是否有必要,谢谢你的回答! :)

5 个答案:

答案 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

但是,您可能会同意这可能相当麻烦,理论上容易出错,例如:如果有人选择常见字词或名称,例如CUSTOMERCUSTOMER_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.cppB.cpp#include "header.h",那么当编译器编译第二个时,你将会遇到很多错误,例如“并且 - 这样的类已经被定义为“或”这样的变量已被定义“。

但是如果你有一个标题保护,那么当它第二次尝试包含标题时#ifndef将会失败,因为SOMETHING_H已经定义了(当它第一次包含标题时) 。因此它将跳过整个文件,直到它到达#endif并且您不会多次声明变量。

如果你现在只做小项目,这对你来说可能不会有问题,但强烈建议你进入这个项目。