Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, estou tentando apenas criar arquivos CPPs diferentes mas que sejam executados em um único MAIN juntos. Segue abaixo o código, e por fim o erro compilando pelo G++.
Main.cpp
#include <iostream>
#include <string>
#include "Classes.h"
#include "Character.cpp"
#include "Monster.cpp"
using namespace std;
int main() {
Monster Poring(80, 10, 347, 782);
EvilMonster Thanatos(15000, 70000, 423, 241, 9);
Character User("tiobilly", "", "", 99, NOVICE);
return 0;
}
Classes.h
/*
* File Description:
Este arquivo armazenada todas as classes disponíveis
no jogo, para adicionar uma classe é só adicionar uma linha
utilizando a vírgula na linha anterior.
* Created by: Bruno Alano (http://brunoalano.com.br)
*/
using namespace std;
/**
Characters Classes (Jobs) */
enum Jobs {
NOVICE, // 0
SWORDMAN, // 1
MAGE, // 2
PRIEST, // 3
SOUL_LINKER // 4
};
Character.cpp
#include <iostream>
#include <string>
#include "Classes.h"
using namespace std;
/**
Characters
Create a Character Object
*/
class Character {
protected:
string nickname;
string guildName;
string partyName;
Jobs job;
int accLvl;
public:
Character(const string n, const string gName, const string pName, int aLvl, Jobs j) {
nickname.append(n);
guildName.append(gName);
partyName.append(pName);
accLvl = aLvl;
job = j;
}
};
Monster.cpp
#include <iostream>
#include <string>
using namespace std;
/**
All Monsters Style
Simple monster, with no natural element.
Use:
Monster <monsterName> (<monster health>, <monster attack>,
<monster pos. x>, <monster pos. y>);
*/
class Monster {
int health, attackPower;
int x, y; / Position /
public:
int getHealth();
int getAttackPwr();
int getPositionX();
int getPositionY();
Monster(int h, int atk, int pX, int pY) {
this->health = h;
this->attackPower = atk;
this->x = pX;
this->y = pY;
}
};
/**
Return the Monster Health (HP) */
int Monster::getHealth() {
return this->health;
}
/**
Return the Monster Attack Power */
int Monster::getAttackPwr() {
return this->attackPower;
}
/**
Return the Monster Position X */
int Monster::getPositionX() {
return this->x;
}
/**
Return the Monster Position Y */
int Monster::getPositionY() {
return this->y;
}
/**
Evil Monster Element.
This type of monsters, has special skills and a element type.
Based on Monster class.
Use:
EvilMonster <monsterName> (<monster health>, <monster attack>,
<monster pos. x>, <monster pos. y>, <monster skill>);
*/
class EvilMonster : public Monster {
int skill;
public:
EvilMonster(int h, int atk, int pX, int pY, int skillNm) : Monster(h, atk, pX, pY) {
/ Evil Monster Define /
this->skill = skillNm;
}
int getSkill();
};
/**
Return the Evil Monster Special Skill */
int EvilMonster::getSkill() {
return this->skill;
}
ERRO:
>
C:\Temp\BrunoAlano>g++ Main.cpp Character.cpp Monster.cpp -o programa
C:\DOCUME~1\BRUNO~1.MED\CONFIG~1\Temp/ccATaaaa.o(.text+0x100):Monster.cpp: multi
ple definition of `Monster::getHealth()'
C:\DOCUME~1\BRUNO~1.MED\CONFIG~1\Temp/ccSwaaaa.o(.text+0x100):Main.cpp: first de
fined here
C:\DOCUME~1\BRUNO~1.MED\CONFIG~1\Temp/ccATaaaa.o(.text+0x10a):Monster.cpp: multi
ple definition of `Monster::getAttackPwr()'
C:\DOCUME~1\BRUNO~1.MED\CONFIG~1\Temp/ccSwaaaa.o(.text+0x10a):Main.cpp: first de
fined here
C:\DOCUME~1\BRUNO~1.MED\CONFIG~1\Temp/ccATaaaa.o(.text+0x116):Monster.cpp: multi
ple definition of `Monster::getPositionX()'
C:\DOCUME~1\BRUNO~1.MED\CONFIG~1\Temp/ccSwaaaa.o(.text+0x116):Main.cpp: first de
fined here
C:\DOCUME~1\BRUNO~1.MED\CONFIG~1\Temp/ccATaaaa.o(.text+0x122):Monster.cpp: multi
ple definition of `Monster::getPositionY()'
C:\DOCUME~1\BRUNO~1.MED\CONFIG~1\Temp/ccSwaaaa.o(.text+0x122):Main.cpp: first de
fined here
C:\DOCUME~1\BRUNO~1.MED\CONFIG~1\Temp/ccATaaaa.o(.text+0x12e):Monster.cpp: multi
ple definition of `EvilMonster::getSkill()'
C:\DOCUME~1\BRUNO~1.MED\CONFIG~1\Temp/ccSwaaaa.o(.text+0x12e):Main.cpp: first de
fined here
collect2: ld returned 1 exit status
C:\Temp\BrunoAlano>
Grato, Bruno Alano.
Olá!
Primeiro, sua separação está errada. Separa-se arquivos em .hpp (convenção para C++) e .cpp, onde no .hpp fica a declaração (por exemplo, das funções e classes, os protótipos), enquanto no .cpp fica a implementação (o código em si).
Outra coisa que se deve observar é que adicionar um .hpp duas ou mais vezes pode gerar erros. Por exemplo, se você dá #include "teste.hpp" e #include "class.hpp", e o teste.hpp tiver #include "class.hpp", pode gerar erros de compilação.
Assim, para evitar esse problema, inclua a diretiva #pragma once ou, para compiladores baseados em nix (mingw é uma port do gcc do nix, não esqueça), é melhor usar #ifndef. Os dois exemplos abaixo:
Classes.hpp
#pragma once
/*
* File Description:
Este arquivo armazenada todas as classes disponíveis
no jogo, para adicionar uma classe é só adicionar uma linha
utilizando a vírgula na linha anterior.
* Created by: Bruno Alano (http://brunoalano.com.br)
*/
using namespace std;
/**
Characters Classes (Jobs) */
enum Jobs {
NOVICE, // 0
SWORDMAN, // 1
MAGE, // 2
PRIEST, // 3
SOUL_LINKER // 4
};
Classes.hpp
#ifndef CLASSES_HPP
#define CLASSES_HPP
/*
* File Description:
Este arquivo armazenada todas as classes disponíveis
no jogo, para adicionar uma classe é só adicionar uma linha
utilizando a vírgula na linha anterior.
* Created by: Bruno Alano (http://brunoalano.com.br)
*/
using namespace std;
/**
Characters Classes (Jobs) */
enum Jobs {
NOVICE, // 0
SWORDMAN, // 1
MAGE, // 2
PRIEST, // 3
SOUL_LINKER // 4
Assim, ambos fazem com que o .hpp seja incluído só uma vez, já que na primeira inclusão o .hpp será incluído, mas na próxima, como CLASSES_HPP já estará definido, o código do arquivo será pulado até o #endif respectivo ao #ifndef CLASSES_HPP. O #pragma once é um método automatizado disso.
Agora, o Character.cpp deve possuir só declarações. Chame-o de Character.hpp. Após isso, crie um outro arquivo chamado Character.cpp que inclua só o Character.hpp, e que possua só a implementação, sem redefinir a classe. Agora, no Character.hpp, não se deve incluir o Character.cpp.
Assim, ao incluir Character.hpp, a implementação será incluída também.
Repita o processo para o Monster.cpp
Tenta aê e mostra como ficou. Dou uma ajudada caso ainda não ficar bom.
Abraços :D