Я хочу сделать программу, которая будет в 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
и я не знаю, правильно ли я делаю «#include» файлы. Я помню, что мой профессор использовал что-то вроде «#ifndef SOMETHING», но я не знаю, если это необходимо, спасибо за ваши ответы! 🙂
использование #include "Persona.hpp"
вместо #include <Persona.hpp>
Похоже, у вас неправильный набор каталогов.
Кроме того, вы по сути включаете свой заголовок «неправильным» способом, что также может быть причиной:
#include "header.h"
: Сначала будет искать в вашем текущем каталоге кода (то есть, где находится ваш файл cpp) при поиске этого конкретного заголовочного файла.
#include <header.h>
: Сначала будет выглядеть в вашей системе / предопределенные каталоги включения.
Однако, исходя из настроек вашего компилятора (ов), его версии и т. Д., Возможно, что не будет никакой разницы (если у вас нет конфликтующих имен файлов). Это определенно хорошая идея всегда следовать по намеченному маршруту:
использование #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
Если у вас есть разные каталоги для исходных и заголовочных файлов, пожалуйста, убедитесь, что вы нашли правильный каталог. Возможно, вам придется изменить каталог следующим образом:
#include "../Headers/Persona.hpp"
Для лучшего подхода к программированию в OOPS всегда используйте директиву #ifndef в вашем файле .h или .hpp.
начните свой .hpp, как это.
#ifndef __PERSONA_HPP
#define __PERSONA_HPP
и в конце вашего файла поставьте эту строку
#endif
Это позаботится о многих вещах и не будет включать заголовочный файл много раз.
Я помню, что мой профессор использовал что-то вроде «#ifndef SOMETHING», но я не знаю, если это необходимо,
#ifndef
является охранником заголовка. Дело не в том, что вызывает ваши проблемы, а в том, как их использовать. Вы помещаете их в верхнюю часть заголовка следующим образом:
#ifndef SOMETHING_H
#define SOMETHING_H
и в конце заголовка вы положите:
#endif
Это в основном означает, что каждый заголовок включается ровно один раз. Если у вас нет защиты заголовка, вы можете столкнуться с проблемами.
Например, если у вас есть A.cpp
а также B.cpp
что оба #include "header.h"
затем, когда компилятор компилирует вторую, вы получите много ошибок по типу «такой-то класс уже определен» или «такая-то переменная уже определена».
Но если у вас есть защита заголовка, то когда он пытается включить заголовок во второй раз, #ifndef
потерпит неудачу, потому что SOMETHING_H
будет уже определен (когда он включил заголовок в первый раз). Таким образом, он пропустит весь файл, пока не доберется до #endif
и вы не будете объявлять переменные несколько раз.
Это, вероятно, не будет проблемой для вас, если вы сейчас делаете небольшие проекты, но это настоятельно рекомендуемая привычка.