Заголовок, определения функций, main в разных файлах

Я хочу сделать программу, которая будет в 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», но я не знаю, если это необходимо, спасибо за ваши ответы! 🙂

0

Решение

использование #include "Persona.hpp" вместо #include <Persona.hpp>

2

Другие решения

Похоже, у вас неправильный набор каталогов.

Кроме того, вы по сути включаете свой заголовок «неправильным» способом, что также может быть причиной:

  • #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
1

Если у вас есть разные каталоги для исходных и заголовочных файлов, пожалуйста, убедитесь, что вы нашли правильный каталог. Возможно, вам придется изменить каталог следующим образом:

#include "../Headers/Persona.hpp"
0

Для лучшего подхода к программированию в OOPS всегда используйте директиву #ifndef в вашем файле .h или .hpp.
начните свой .hpp, как это.

#ifndef __PERSONA_HPP
#define __PERSONA_HPP

и в конце вашего файла поставьте эту строку

#endif

Это позаботится о многих вещах и не будет включать заголовочный файл много раз.

0

Я помню, что мой профессор использовал что-то вроде «#ifndef SOMETHING», но я не знаю, если это необходимо,

#ifndef является охранником заголовка. Дело не в том, что вызывает ваши проблемы, а в том, как их использовать. Вы помещаете их в верхнюю часть заголовка следующим образом:

#ifndef SOMETHING_H
#define SOMETHING_H

и в конце заголовка вы положите:

#endif

Это в основном означает, что каждый заголовок включается ровно один раз. Если у вас нет защиты заголовка, вы можете столкнуться с проблемами.

Например, если у вас есть A.cpp а также B.cpp что оба #include "header.h"затем, когда компилятор компилирует вторую, вы получите много ошибок по типу «такой-то класс уже определен» или «такая-то переменная уже определена».

Но если у вас есть защита заголовка, то когда он пытается включить заголовок во второй раз, #ifndef потерпит неудачу, потому что SOMETHING_H будет уже определен (когда он включил заголовок в первый раз). Таким образом, он пропустит весь файл, пока не доберется до #endif и вы не будете объявлять переменные несколько раз.

Это, вероятно, не будет проблемой для вас, если вы сейчас делаете небольшие проекты, но это настоятельно рекомендуемая привычка.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector