Странная ошибка "floatcentOfOres" (?centOfOres @@ 3MA) уже определена в Days.obj - PullRequest
0 голосов
/ 21 апреля 2020

Я новичок в c ++ и пишу простую ролевую игру для майнинга. Я программировал только пару недель, но я столкнулся с ошибкой, над которой я работал несколько дней и до сих пор ничего не придумаю. Я даже подумывал просто отказаться от своей программы и попробовать ее снова. У меня есть 4 файла: Game. cpp, header.h, nuggetsFound. cpp и days. cpp. Я пытаюсь создать глобальную переменную, которую я могу изменить во всех файлах, однако, даже если я даже не переопределяю или что-то еще, я продолжаю сталкиваться с этой сумасшедшей ошибкой, которая говорит "floatcentOfOres" (?centOfOres @@ 3MA) уже определено в Days.obj. Некоторые из них всплывают для всех моих переменных и файлов, и я схожу с ума. Мне всего 13 лет, поэтому я не всегда могу получить всю необходимую помощь, поэтому я был бы очень признателен, если бы вы, ребята, могли мне помочь. Спасибо! (Я исключил nuggetsFound. cpp, потому что это в основном та же ситуация, что и в днях. cpp. В игре также намного больше кода. cpp, но я просто включил то, что мне показалось уместным. Это два файла

game.cpp
#include <iostream>
#include <string>
#include <stdlib.h>
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include "Header.h"
using namespace std;
float netWorth{ 0.0 };
float salary{ 0.0 };
float percentOfOres{ 0.0 };

int main()
{
    cout << "Welcome to Miner Man!\n";
    cout << "Press any key and press enter to continue";days.cpp

#include "game.cpp"


using namespace std;

void days()
{
    for (int iii{ 1 }; iii <= 5; iii++)
    {
        cout << "Net Worth: " << netWorth << "\tSalary: " << salary << 
"\tPercent of Ores: " << percentOfOres;
        cout << "\n";
        cout << "CCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n";
        cout << "CCCCCCCCCCCCC\n";
        cout << "CCCCCCCC\n";
        cout << "CCCC            ///////\n";
        cout << "CCC             |O  O |\n";
        cout << "CC              | __  |\n";
        cout << "C              asssssssa\n";
        cout << "C            a  sssssss  a\n";
        cout << "C           a   sssssss   a\n";
        cout << "           a    sssssss   a\n";
        cout << "C         h     sssssss   a\n";
        cout << "C p      h      sssssss    \n";
        cout << "C  p    h       l     l\n";
        cout << "CC  p  h      p l     l\n";
        cout << "CCC   p p p p___l     l___\n";
        cout << "CCCCC       L___l     l___l\n";
        cout << "CCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n";
        Sleep(500);
        system("cls");

        cout << "Net Worth: " << netWorth << "\tSalary: " << salary << 
"\tPercent of Ores: " << percentOfOres;
        cout << "\n";
        cout << "CCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n";
        cout << "CCCCCCCCCCCCC\n";
        cout << "CCCCCCCC\n";
        cout << "CCCC  p         ///////\n";
        cout << "CCC  p          |O  O |\n";
        cout << "CC  p           | __  |\n";
        cout << "C   phhhhhhaaaa sssssssa\n";
        cout << "C   p           sssssss  a\n";
        cout << "C    p          sssssss   a\n";
        cout << "C     p         sssssss   a\n";
        cout << "C               sssssss   a\n";
        cout << "C               sssssss    \n";
        cout << "C               l     l\n";
        cout << "CC              l     l\n";
        cout << "CCC          ___l     l___\n";
        cout << "CCCCC       L___l     l___l\n";
        cout << "CCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n";
        Sleep(500);
        system("cls");
    }
}

#pragma once
#include <iostream>
#include <string>
#include <stdlib.h>
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include "data.hpp"
using namespace std;



void days();
void endOfDayNugs();


void endOfDayNugs()
{
    srand((unsigned)time(0));
    int silverFoundToday = rand() % 25;

    srand((unsigned)time(0));
    int goldFoundToday = rand() % 10;

    srand((unsigned)time(0));
    int diamondsFoundToday = rand() % 5;

    if (silverFoundToday == 0)
    {
        cout << "Sorry, you found no Silver today\n";
        Sleep(3000);
        system("cls");
    }
    else if (silverFoundToday > 0)
    {
        for (int sss{ 1 }; sss < 3; sss++)
        {
            cout << "You found " << silverFoundToday << " silver!\n";
            cout << "\n/SSSSSS\\\n";
            Sleep(500);
            system("cls");
        }

        if (percentOfOres == 0)
        {
            cout << "You don't make any money of your silver yet, but                 continue working towards that promotion!";
            Sleep(5000);
            system("cls");
        }
        else if (percentOfOres > 0)
        {
            cout << "You made " << percentOfOres * silverFoundToday <<         "dollers off of your silver\n";
            netWorth += percentOfOres * silverFoundToday;
            Sleep(5000);
            system("cls");
        }
    }
    if (goldFoundToday == 0)
    {
        cout << "Sorry, you found no gold today\n";
        Sleep(3000);
        system("cls");
    }
    else if (goldFoundToday > 0)
    {
        for (int ggg{ 1 }; ggg < 3; ggg++)
        {
        cout << "You found " << goldFoundToday << " gold!\n";
        cout << "\n/GGGGGG\\\n";
        Sleep(500);
        system("cls");
    }

    if (percentOfOres == 0)
    {
        cout << "You don't make any money of your gold yet, but continue working towards that promotion!";
        Sleep(5000);
        system("cls");
    }
    else if (percentOfOres > 0)
    {
        cout << "You made " << percentOfOres * goldFoundToday << "dollers off of your gold\n";
        netWorth += percentOfOres * goldFoundToday;
        Sleep(5000);
        system("cls");
    }
}
if (diamondsFoundToday == 0)
{
    cout << "Sorry, you found no diamonds today\n";
    Sleep(3000);
    system("cls");
}
else if (diamondsFoundToday > 0)
{
    for (int ddd{ 1 }; ddd < 3; ddd++)
    {
        cout << "You found " << diamondsFoundToday << " diamonds!\n";
        cout << "\n/DDDDDD\\\n";
        Sleep(500);
        system("cls");
    }

    if (percentOfOres == 0)
    {
        cout << "You don't make any money of your diamonds yet, but continue working towards that promotion!";
        Sleep(5000);
        system("cls");
    }
    else if (percentOfOres > 0)
    {
        cout << "You made " << percentOfOres * diamondsFoundToday << "dollers off of your diamonds\n";
        netWorth += percentOfOres * diamondsFoundToday;
        Sleep(5000);
        system("cls");
    }
}

}

1 Ответ

1 голос
/ 21 апреля 2020
  • Любые глобальные вещи должны быть объявлены, но не определено в вашем файле заголовка.
  • Включить файл заголовка в ваши файлы. cpp.
  • Не включайте. cpp файлы в другие. cpp файлы.
  • Объявите каждую вещь в заголовочном файле в один вашего. cpp файлы.

Объявление гласит: "эта вещь где-то существует", а определение гласит "заставить эту вещь существовать". C ++ имеет правило одного определения, которое гласит, что во всей программе может существовать только одно определение для конкретной вещи. 1

Если вы поместите определение в заголовочный файл и включите его в два. cpp файла, тогда определение существует дважды в программе (по одному в каждом. cpp файле), и это является причиной вашей ошибки.

Вот несколько примеров объявлений:

void foo();       // function declaration
extern float bar; // variable declaration

Вот несколько примеров определений:

void foo() { }       // function definition
float bar;           // global variable definition
static float widget; // local variable definition

Итак, в вашем .h файле вы должны объявить свои переменные, но не определите их:

extern float netWorth;
extern float salary;
extern float percentOfOres;

Затем в одном ваших. cpp файлах вы определите их:

float netWorth{ 0.0 };
float salary{ 0.0 };
float percentOfOres{ 0.0 };

Любые переменные верхнего уровня (объявленные вне функции), которые используются только в одном файле. cpp, могут быть объявлены static. Эти переменные считаются скрытыми деталями реализации этого одного модуля компиляции и не будут видны снаружи.

То есть, вы можете иметь static float foo; в двух разных файлах. cpp, не нарушая одно- определение правила. Однако имейте в виду, что foo каждого файла относится к отдельной переменной!


1 Есть некоторые исключения из этого правила. В частности, функции, объявленные inline, могут присутствовать в нескольких блоках компиляции, и компоновщик выберет один из них и отбросит остальные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...