Ошибка переопределения структуры tm. Проблемы с заголовками

Ошибка: ||=== Сборка: Отладка в Davis_project1 (компилятор: компилятор GNU GCC) ===|

c:\mingw\include\time.h|172|ошибка: переопределение 'struct tm'|

c:\mingw\include\wchar.h|87|ошибка: предыдущее определение 'struct tm'|

||=== Ошибка сборки: 2 ошибки, 0 предупреждений (0 минут, 0 секунд)) ===|

Моя программа работала нормально, пока я не попытался добавить заголовок ctime для функции srand. С тех пор я получаю переопределение «struct tm» и предыдущее определение ошибок «struct tm». Интернет говорит мне, что это проблема с заголовком. Итак, вот все мои заголовки и cpp ниже. Любые советы приветствуются. Ниже мой основной cpp. я думаю дело тут

#include <iostream>
#include <string>
#include "Club.h"
#include <ctime>
using namespace std;

int main(){

Club Club1;
Club1.displayMenu();
Club1.processInput();
}

Заголовок Cbros

#ifndef CBROS_H
#define CBROS_H

#include <iostream>

class Cbros
{
public:

    Cbros();
    //default constructor
    Cbros(std::string , int , double );

    std::string getName()const;
    int getAge ()const;
    int getStr()const;
    int getCharm()const;
    int getIntel()const;
    int getHeight ()const;
    void setName(std::string);
    void setAge(int);
    void setHeight(int);
    void setIntel(int);
    void setStr(int);
    void setCharm(int);
    void MeetGirl(int, int, int);
    void GirlChance(int, int, int);








   class Wallet{
public:
    double addMoney(double amount);//Adds  Money to wallet
    double removeMoney(double amount);//removes money from wallet
    int countMoney();//displays money in wallet
protected:
    int money;

};
Wallet Mywallet;



protected:

    std::string newName;
    std::string newRace;
    int newAge;
    double newHeight;
    int newStr;
    int newInt;
    int newCharm;





private:

};



#endif // CBROS

cbros cpp

#include "Cbros.h"


Cbros::Cbros()
{
}
Cbros::Cbros(std::string name ,int age , double height )
:newName(name),newAge(age),newHeight(height)
{
}

std::string Cbros::getName() const{
return newName;
}

int Cbros::getAge() const{
return newAge;
}
int Cbros::getHeight() const{
return newHeight;
}

int Cbros::getIntel() const{
return newInt;
}

int Cbros::getCharm() const{
return newCharm;
}
int Cbros::getStr() const{
return newStr;
}

void Cbros::setName(std::string name){
newName=name;
}


void Cbros::setAge(int age){
newAge=age;
}

void Cbros::setHeight(int height){
newHeight=height;
}
void Cbros::setCharm(int charm){
newCharm=charm;
}
void Cbros::setIntel(int intel) {
newInt=intel;
}
void Cbros::setStr(int str){
newStr=str;
}

double Cbros::Wallet::addMoney(double amount){if ( amount < 0 )
    return 0;
money += amount;
return amount;
}
double Cbros::Wallet::removeMoney(double amount) {
if ( ( amount < 0 ) || ( money < amount ) )
    return 0;
money -= amount;
return amount;
}
int Cbros::Wallet::countMoney() {
return money;
}
void Cbros::MeetGirl(int newStr, int newCharm, int newInt){

if (newHeight>=60){

    std::cout<<"Mmmm I like my men tall, Hi, I'm Brittany";

}

}
void Cbros::GirlChance(int newStr, int newCharm, int newInt){

}

Заголовок клуба

#ifndef CLUB_H
#define CLUB_H
#include "Cbros.h"


class Club: public Cbros
{
public:
    Club();
    int displayMenu();
    void processInput();
    int menuSelection;


protected:


private:


};

#endif // CLUB_H

клуб cpp

class Cbros;
class Jock;
class Artsy;
class Engineering;

#include "Club.h"




Club::Club()
{}


int Club::displayMenu(){
std::cout<<"Welcome Meet a Girl Game!"<<std::endl;
std::cout<<"The goal is to use your inherent skills to earn a girl's phone    number\n\n";
std::cout<<"Please enter the number of your choice:\n\n";
std::cout<<"1. Go the Club\n";
std::cout<<"2. Stay at Home\n";

std::cin>>menuSelection;
return menuSelection;





}
void Club::processInput(){
while (menuSelection!=1&&menuSelection!=2){
    std::cout<<"invalid choice\n"<<displayMenu();

}
if (menuSelection==1){
    std::cout<<"Are you a\n";
    std::cout<<"1. Engineer Bro?\n";
    std::cout<<"2. Artsy Bro?\n";
    std::cout<<"3. Jock Bro?\n";
    std::cin>>menuSelection;

    switch(menuSelection){

case 1:{
    std::cout<<"Welcome Engineer Bro\n";
    std::cout<<"Please enter your name:";
    std::cin.ignore();
    std::getline(std::cin, newName);
    std::cout<<"Please enter your Height(in inches):";
    std::cin>>newHeight;
    std::cout<<"Please enter your Age:";
    std::cin>>newAge;
    Cbros Engine(newName, newAge, newHeight);
    Engine.setCharm(3);
    Engine.setStr(3);
    Engine.setIntel(6);
    std::cout<<std::string(20,'\n');


    std::cout<<"Class: Engineer\n";
    std::cout<<"Name: "<<Engine.getName()<<std::endl;
    std::cout<<"Height: "<<Engine.getHeight()<<std::endl;
    std::cout<<"Age "<<Engine.getAge()<<std::endl;
    std::cout<<"Initial Stats"<<std::endl;
    std::cout<<"Charm: "<<Engine.getCharm()<<std::endl;
    std::cout<<"Strength: "<<Engine.getStr()<<std::endl;
    std::cout<<"Intelligence: "<<Engine.getIntel() <<std::endl<<std::endl<<std::endl<<std::endl;
    std::cout<<"Welcome to Club CSC 1310\n";
    std::cout<<"No time to waste lets meet some girls!\n";
    std::cout<<"Hmmm I think I see someone they may be your type over there";
    Engine.MeetGirl(3,3,6);




    break;
    }

case 2:{
    std::cout<<"Welcome Artsy Bro!\n";
    std::cout<<"Please enter your name:";
    std::cin.ignore();
    std::getline(std::cin, newName);
    std::cout<<"Please enter your Height(in inches):";
    std::cin>>newHeight;
    std::cout<<"Please enter your Age:";
    std::cin>>newAge;
    Cbros Artsy(newName, newAge, newHeight);
    Artsy.setCharm(6);
    Artsy.setStr(3);
    Artsy.setIntel(3);
    std::cout<<"Artsy Bro's Name: "<<Artsy.getName()<<std::endl;
    std::cout<<"Height: "<<Artsy.getHeight()<<std::endl;
    std::cout<<"Age "<<Artsy.getAge()<<std::endl;
    std::cout<<"Initial Stats"<<std::endl;
    std::cout<<"Charm: "<<Artsy.getCharm()<<std::endl;
    std::cout<<"Strength: "<<Artsy.getStr()<<std::endl;
    std::cout<<"Intelligence: "<<Artsy.getIntel()<<std::endl;

    break;
    }
case 3: {

    std::cout<<"Welcome Jock Bro!\n";
    std::cout<<"Please enter your name:";
    std::cin.ignore();
    std::getline(std::cin, newName);
    std::cout<<"Please enter your Height(in inches):";
    std::cin>>newHeight;
    std::cout<<"Please enter your Age:";
    std::cin>>newAge;
    Cbros Jock(newName, newAge, newHeight);
    Jock.setCharm(3);
    Jock.setStr(6);
    Jock.setIntel(3);
    std::cout<<"Jock Bro's Name: "<<Jock.getName()<<std::endl;
    std::cout<<"Height: "<<Jock.getHeight()<<std::endl;
    std::cout<<"Age "<<Jock.getAge()<<std::endl;
    std::cout<<"Initial Stats"<<std::endl;
    std::cout<<"Charm: "<<Jock.getCharm()<<std::endl;
    std::cout<<"Strength: "<<Jock.getStr()<<std::endl;
    std::cout<<"Intelligence: "<<Jock.getIntel()<<std::endl;



    break;
    }
default:


    break;
    }
}
else if(menuSelection==2){
    std::cout<<"Enjoy Netflix Bro";}
}

Три других производных класса от Cbros, все они имеют одинаковые настройки .h и .cpp, как показано ниже.

Jock Header

#ifndef JOCK_H
#define JOCK_H
#include "Cbros.h"

спортсмен

#include "Jock.h"

jock::Jock()
{

}

Заголовок инженера

#ifndef ENGINEERING_H
#define ENGINEERING_H
#include "Cbros.h"

Инженер cpp

class Engineering: public Cbros
{
public:
    Engineering();

protected:
private:

};

Вычурный заголовок

#ifndef ARTSY_H
#define ARTSY_H

#include "Cbros.h"

class Artsy : public Cbros
{
public:
    Artsy();



protected:


private:
};

#endif // ARTSY_H

вычурный cpp

#include "Artsy.h"

Artsy::Artsy()
{

}

person Kelvin Davis    schedule 27.10.2016    source источник
comment
Не по теме: Обычная кляча. На дворе 2016 год. Время укладывать srand спать. Используйте вместо этого <random>.   -  person user4581301    schedule 27.10.2016
comment
Стоит еще раз отредактировать, чтобы сузить круг вопросов, до которых файл cpp отказывается компилироваться из-за слишком большого количества struct tm.   -  person user4581301    schedule 27.10.2016
comment
Всякий раз, когда я использую генератор случайных чисел Google, я получаю его пример. Я посмотрю на ‹random›. Спасибо!   -  person Kelvin Davis    schedule 27.10.2016
comment
@user4581301 user4581301 Ошибка не говорит где, она просто вызывает отдельный файл заголовка для time.h и wchar.h, которого нет в моем проекте, и приводит меня к строке 87 struct tm { и строке 172 struct tm.   -  person Kelvin Davis    schedule 27.10.2016
comment
Каждый файл cpp компилируется отдельно, поэтому, если вы немного прочитаете вывод сборки, он должен сказать вам, какой файл cpp компилируется при возникновении ошибки.   -  person user4581301    schedule 27.10.2016
comment
Если вы используете GCC (g++), добавьте параметр -H, чтобы вывести список включенных заголовков (который определяет, какой заголовок включает какие другие заголовки).   -  person Jonathan Leffler    schedule 27.10.2016
comment
@JonathanLeffler Похоже, это происходит, когда я компилирую main.cpp, он говорит о многократном использовании struct tm from, time.h и wchar.h   -  person Kelvin Davis    schedule 27.10.2016
comment
Возможно, вам придется вернуться к заголовку верхнего уровня, который вы включили, но <ctime> является вероятным кандидатом, и выяснить, что пошло не так. Возможно, вам придется посмотреть на вывод препроцессора.   -  person Jonathan Leffler    schedule 27.10.2016
comment
В норме не должно происходить, какие бы системные заголовки и в каком порядке вы не включали. Какая у вас платформа и версия компилятора?   -  person n. 1.8e9-where's-my-share m.    schedule 27.10.2016
comment
Это не должно быть закрыто как дубликат этого вопроса или любого другого подобного вопроса. Никакое количество циклических зависимостей между заголовками user's не должно приводить к переопределению struct tm из заголовка system.   -  person n. 1.8e9-where's-my-share m.    schedule 27.10.2016
comment
@н.м. платформа - это блоки кода, а версия компилятора - компилятор GNU GCC, я уверен, что использую версию С++ 11.   -  person Kelvin Davis    schedule 27.10.2016
comment
@JonathanLeffler Когда я запускаю -H в параметрах моего компилятора, он говорит, предложения: используйте защиту заголовков для ctime, так что я предполагаю, что проблема в этом. Просто нужно придумать, где разместить охрану.   -  person Kelvin Davis    schedule 27.10.2016
comment
Можете ли вы разместить весь файл ctime на чем-то вроде pastebin.com?   -  person n. 1.8e9-where's-my-share m.    schedule 27.10.2016
comment
@n.m Я отредактировал свой основной файл cpp выше, чтобы показать, что там. Проблема в том, что я включаю Club.h в файл main. Но мне это нужно, чтобы иметь возможность создать объект клуба, чтобы начать игру. предложения?   -  person Kelvin Davis    schedule 27.10.2016
comment
Опубликуйте минимально воспроизводимый пример. У вас есть #ifndef без #endif в опубликованных заголовках, которые не могут работать. Вы также разместили нерелевантные файлы, которые вы даже не компилируете. Убедитесь, что вы можете скопировать свое сообщение, вставить его в файл или несколько файлов без каких-либо изменений, вызвать компилятор и получить ту же ошибку, что и в противном случае. Если вы не можете этого сделать, ваш опубликованный код не содержит полезного контента.   -  person n. 1.8e9-where's-my-share m.    schedule 27.10.2016
comment
@н.м. Взял немного, но весь код есть, который выдает ошибку.   -  person Kelvin Davis    schedule 27.10.2016
comment
Почему вы публикуете все производные классы? Вы получаете ошибку компиляции при компиляции одного файла cpp. Опубликуйте его и все заголовки, которые ему необходимы, и ничего больше.   -  person n. 1.8e9-where's-my-share m.    schedule 27.10.2016
comment
Кроме того, ПОЖАЛУЙСТА, УБЕДИТЕСЬ, что вы публикуете именно то, что скомпилировали, а не какую-то его версию, отредактированную вручную. Где закрывающая скобка в main.cpp? Что делает Class.cpp в шапке Клуба?   -  person n. 1.8e9-where's-my-share m.    schedule 27.10.2016
comment
@n.m Извините, я не был уверен, хотите ли вы провести тест самостоятельно или нет. Даю тми, извиняюсь. Выложил точные коды ошибок.   -  person Kelvin Davis    schedule 27.10.2016
comment
Я не могу воспроизвести проблему. Скопируйте проект в новый каталог и скомпилируйте с помощью командной строки g++ -std=c++11 main.cpp. Вы все еще получаете ошибку?   -  person n. 1.8e9-where's-my-share m.    schedule 27.10.2016


Ответы (1)


Это проблема вашего компилятора, в VC++ такой проблемы нет.

Структура tm уже определена в файле wchar.h (поставляется с cstring). Чтобы решить эту ошибку, вы можете использовать getpid() в качестве начального значения.

// Both header-files are necessary for 'getpid()'
#include <sys/types.h>
#include <unistd.h>

srand(getpid());

PID или идентификатор процесса не меняются во время выполнения вашей программы, поэтому устанавливайте начальное значение только один раз.

person Alphastrick    schedule 03.11.2016