2014-01-15 4 views
0

Я хочу сделать программу, которая будет в 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 и я не знаю, если im делает правильные файлы «#including». Я помню, мой профессионал использовал что-то вроде «#ifndef SOMETHING», но я не знаю, нужно ли это, спасибо за ваши ответы! :)

+0

Для начала измените '#include ' на '#include" Persona.hpp "'. Во-вторых, '#ifndef PERSONA_HEADER' называется защитой заголовка (или включает в себя охрану, или включает fencepost, или множество других имен) и используется для защиты от множественного включения зависимых заголовков. Есть много примеров правильного использования этого на этом сайте. Сделайте некоторые поиски на этих условиях. – WhozCraig

ответ

2

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

+0

Попытка заменить <> для "" дает мне еще одну ошибку: -------------- Сборка: выпуск в Persona (компилятор: компилятор GNU GCC) ---------- ----- mingw32-g ++. exe -o bin \ Release \ Persona.exe obj \ Release \ main.o obj \ Release \ Persona.o Persona.hpp.gch -s Persona.hpp.gch: файл не распознан: Формат файла не распознается collect2.exe: ошибка: ld возвращен 1 статус выхода Процесс завершен со статусом 1 (0 минута (минут), 0 секунд (я)) 0 ошибок, 0 предупреждений (0 минут (ов), 0 секунд (ов)) – MrcRjs

+0

@MrcRjs Поскольку вы используете предварительно скомпилированные заголовки (деактивируйте их, если вы не уверены, что делаете), обязательно очистите/очистите каталог сборки хотя бы один раз после внесения значительных изменений в свои заголовки. – Mario

+0

Я установил параметры компилятора по умолчанию и удалил «persona.hpp.ghc», но создала пороги и дала ошибку здания:/ – MrcRjs

0

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

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

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

#ifndef __PERSONA_HPP 
#define __PERSONA_HPP 

и при окончании файла поместить эту строку

#endif 

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

1

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

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

  • #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 #pragma once. Если эта строка находится в файле заголовка (и активного), компилятор будет гарантировать, что он никогда не более одного раза:

#pragma once 

// Your header file code 
+0

После изменения <> для "" это дает мне эту ошибку: -------------- Сборка: выпуск в Persona (компилятор: компилятор GNU GCC) -------- ------- mingw32-g ++. Exe -o bin \ Release \ Persona.exe obj \ Release \ main.o obj \ Release \ Persona.o Persona.hpp.gch -s Persona.hpp.gch : файл не распознан: формат файла не распознан collect2.exe: ошибка: ld возвращен 1 статус выхода Процесс завершен со статусом 1 (0 минута, 0 секунд) 0 error (s), 0 warning() s) (0 минута, 0 секунд (ов)) – MrcRjs

+0

И уже добавлено «#ifndef __PERSONA_HPP #define __PERSONA_HPP» to Persona.hpp – MrcRjs

0

I remember my profesor was using something like "#ifndef SOMETHING" but i don't know if it is necessary,

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

#ifndef SOMETHING_H 
#define SOMETHING_H 

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

#endif 

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

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

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

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

Смежные вопросы