Ir ao conteúdo

Chamar vários arquivos, arquivos externos.


deathcon4

Posts recomendados

Postado

Estou com de dúvida de como faço para chamar arquivos externos. Estou testando uma coisa bem simples para entender.

Arquivo principal:

#include <cstdlib>

#include <iostream>

#include "Biblio.hpp"

#include "area_tri.cpp"

using namespace std;

int main(int argc, char *argv[])

{

double p, q, r;

cout << "P? ";

cin >> p;

cout << "Q? ";

cin >> q;

r = soma(p,q);

cout << "Soma= " << r << endl;

system("PAUSE");

return EXIT_SUCCESS;

}

Arquivo externo:

#include "Biblio.h"

double soma(double a, double B)

{

return a + b;

}

Arquivo cabeçalho:

#ifndef BIBLIO_H

#define BIBLIO_H

double soma(double a, double B);

#endif

arquivo externo 2:

{

int com, larg, area;

cout << "Entre com o comprimento";

cin >> com;

cout << "Entre com a largura";

cin >> larg;

area = com * larg;

cout << "A area vale: " << area << endl;

}

Minhas dúvidas:

Sempre tenho que criar um arquivo cabeçalho para chamar um arquivo externo e tenho de chamá-lo através de uma função no arquivo principal?

Tentei chamar o arquivo externo 2 sem colocar qualquer função no principal, mas ele fica dando erro de compilação acusando a falta de toquens ; e {.

No arquivo externo 2 tenho de declarar novamente as bibliotecas?

Obrigado.

Postado

Bom, a missão do cabeçalho é informar o compilador de possíveis coisas que ele vai encontrar pela frente sem necessariamente saber como elas são implementadas, ou seja, como elas funcionam. Assim, se cria uma interface, apenas com as "assinaturas" das funções (tipos de retorno, nome da função, tipos e quantidade de argumentos etc), no cabeçalho; e os pormenores de cada uma delas em seus próprios arquivos. Assim fica mais fácil de fazer a manutenção, de melhorar, de reutilizar etc.

No seu caso então, a função soma tem a interface no cabeçalho Biblio.hpp. Você pode chama-la a partir de qualquer outro local, desde que nesse local a Biblio.hpp esteja inclusa.

Agora, no caso da area_tri.cpp, um arquivo .cpp por si só não é uma interface, é uma implementação. Quando você faz #include "*.cpp", o compilador simplesmente faz copiar/colar do conteúdo de *.cpp pro local do include. Daí você já vê o erro do teu código:

Você está copiando


int com, larg, area;
cout << "Entre com o comprimento";
cin >> com;
cout << "Entre com a largura";
cin >> larg;
area = com * larg;
cout << "A area vale: " << area << endl;

e colando fora do main(). O local adequado seria dentro do escopo do main() ou qualquer outro. Ainda assim a existência da area_tri.cpp por si só é pouco inteligente. Você simplesmente está movendo linhas de um lugar pra outro e em seguida dizendo ao compilador pra recoloca-las de volta. Se usa isso mas não assim. Você pode usar essa tática quando não for possível separar a interface da implementação (sim, algumas vezes não será possível e terão que ficar todos juntos no cabeçalho), mas pro .hpp não ficar muito longo e confuso com dezenas e mais dezenas de linhas de implementação, então as movemos pra um .cpp e logo incluímos no local mais adequado do .hpp.

Melhor transformar essas linhas da area_tri.cpp em uma função com nome próprio, tipo de retorno e tudo o que ela tem direito. Depois colocar a assinatura dela em Biblio.hpp e assim onde quer que você inclua Biblio.hpp, terá a disposição a função soma e a "area_tri".

Postado

Fiz como você explicou. O arquivo .h como protótipo separado da implementação. Também experimentei colocar o protótipo e a implementação juntos no arquivo .h e também funcionou. Tenha dúvida ainda. É possível chamar diretamente um arquivo cpp?

Postado

O máximo que você pode fazer diretamente com um .cpp é inclui-lo com #include. Ou seja, mandar o compilador copiar e colar o conteúdo dele em algum lugar.

A função do .cpp é basicamente conter a implementação e não ser chamado por ninguém. Você simplesmente coloca o nome desses .cpp na linha de comando do compilador, daí ele sabe que deve compilar o programa principal e vários outros "pedaços".

Por exemplo, se você tiver um projeto, no qual a função main() vive no arquivo main.cpp; uma funcao1() e funcao2() declaradas num cabeçalho funcao.hpp e implementadas nos arquivos funcao1.cpp e funcao2.cpp; pra compilar com o g++ basta:

g++ -o main.cpp funcao1.cpp funcao2.cpp

E o projeto vai ser compilado sem precisar "chamar" funcao1.cpp e funcao2.cpp em lugar nenhum.

Postado

Valeu pela ajuda, agora ficou fácil. Vou sempre que possível criar um .h para a interface e prototipação e o cpp para a implementação. Pode acontecer como você disse de não poder separar, ai coloco tudo no .h. É só ter discernimento e saber quando colocar as coisas em cada lugar.

Obrigado.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!