2 / 2 / 0
Регистрация: 18.09.2016
Сообщений: 86
1

"Множественное переопределение имени"

11.03.2019, 17:35. Показов 1364. Ответов 13
Метки нет (Все метки)

Здравствуйте!
Пишу проект с тремя классами в отдельных файлах (.h + .cpp) и дополнительным .h файлом для хранения константных значений, ну и main.cpp разумеется.

Список файлов:

main.cpp (#include "State.h" #include <iostream>)

State.h (#include "Unit.h" #include "Product.h") + State.cpp


(Здесь ничего не подключается):

Unit.h + Unit.cpp

Product.h + Product.cpp

Values.h


Проект собирается нормально, когда в main-е не подключён State.h, как только подключаю, так сразу ловлю 47 ошибок и все одного толка: State.cpp:3: ошибка: multiple definition of `MWork_FC' (Только имя в кавычках меняется, это всё мои переменные из файла Values.h)


Примечательно, что как только я отключаю из main библиотеку <iostream>, количество ошибок сокращается до 36.

Что это значит и как всё исправить?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2019, 17:35
Ответы с готовыми решениями:

Как отключить автоматическое добавление "_" "@" "number" к имени экстернального метода?
Здраствуйте! Подскажите как это делается? (вопрос в названии темы) среда : VS2013 проект...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;,...

Множественное наследование. Класс "Бытовая техника"
Проходим множественное наследование. У меня есть класс &quot;Бытовая техника&quot; и я никак не могу...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов), которые разделяются...

13
109 / 84 / 55
Регистрация: 01.02.2014
Сообщений: 281
11.03.2019, 17:41 2
Добавьте в СВОИ заголовочные файлы:
C++
1
2
3
4
5
6
#ifndef ИМЯ_ЗАГОЛОВОЧНОГО_ФАЙЛА_H //Например STATE_H
#define ИМЯ_ЗАГОЛОВОЧНОГО_ФАЙЛА_H //Например STATE_H
 
//Код
 
#endif
https://en.wikipedia.org/wiki/Include_guard
1
2 / 2 / 0
Регистрация: 18.09.2016
Сообщений: 86
11.03.2019, 17:52  [ТС] 3
Уже присутствует, ещё есть в начале:
C++
1
#pragma once
Добавлено через 9 минут
Так же забыл добавить, что компилятор говорит, что первое определение в main.o и main.cpp

При переходе в первый выпадает огромная таблица ячеек с символами и цифрами
0
16079 / 8681 / 2120
Регистрация: 30.01.2014
Сообщений: 14,960
11.03.2019, 17:59 4
Цитата Сообщение от Alex_fmv Посмотреть сообщение
Что это значит и как всё исправить?
Надо показать код.

Но предварительный анализ астральных потоков говорит о том, что у вас в заголовочном файле находится определение сущности с внешним связыванием. Функция или переменная.
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
11.03.2019, 18:13 5
Цитата Сообщение от Меорн Посмотреть сообщение
Добавьте в СВОИ заголовочные файлы:
Нужно, но от множественных определений (если таковые есть в заголовочном файле) не спасёт.

Добавлено через 1 минуту
Цитата Сообщение от Alex_fmv Посмотреть сообщение
это всё мои переменные из файла Values.h
Содержимое покажи.
0
2 / 2 / 0
Регистрация: 18.09.2016
Сообщений: 86
11.03.2019, 18:14  [ТС] 6
Как это лучше всего сделать? Дело в том, что файлы вроде State.cpp более 600 строк объёмом, но так как вас, вероятно, интересует именно начало, я скину именно его:

main.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
#include "State.h"
#include <iostream>
 
using namespace std;
 
int main()
{
    State *st = new State(100, 100);
    cout << "Result: " << st->MainLoop() << endl;
    return 0;
}

State.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#ifndef STATE_H
#define STATE_H
#include <vector>
#include <algorithm>
#include <random>
#include <ctime>
#include "Product.h"
#include "Unit.h"
#include "Values.h"
 
 
using namespace std;
 
class State
{
private:
    vector<Unit> Units;
    vector<Product> Products;
 
    float Worksize;
    float Energy;
    float Machine;
    float Ferrum;
    float Prod;
    float Food;
 
    float Money;
 
public:
 
    State(unsigned count, unsigned start_capital);
    State();
 
 
    Product &FindBestProduct(int type);
    void GrubResurses(Unit &obj);
    void ClearDeads();
    void Sell(Unit &obj);
    void Buy(Unit &obj);
    void EarnAndSpend(Unit &obj);
    void StateLogic();
    int MainLoop();
};
 
#endif // STATE_H

State.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "State.h"
 
State::State(unsigned count, unsigned start_capital)
{
     srand(time(0));
 
     for(unsigned i = 0; i < count; i++)
     {
         Units.push_back(Unit(0 + rand() % (6), start_capital));
     }
 
}
 
Product &State::FindBestProduct(int type)
{
     vector<Product> special;
 
     copy_if(begin(Products), end(Products), back_inserter(special), [type] (Product &obj)
     {
         return obj.getType() == type;
     });
 
      return *min_element(begin(special), end(special));
}
 
...

Unit.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef UNIT_H
#define UNIT_H
 
class Unit
{
private:
    float worksize;
    float energy;
    float machine;
    float ferrum;
    float prod;
    float food;
 
    float money;
    unsigned short int type; //Тип юнита: (0 - Worker / 1 - Food Center / 2 - Mine / 3 - Machine Factory / 4 - Farm / 5 - Energy Station)
...


Unit.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Unit.h"
 
 
Unit::Unit(unsigned short int type, float money)
{
    this->food = 0;
    this->energy = 0;
    this->prod = 0;
    this->ferrum = 0;
    this->machine = 0;
    this->worksize = 0;
    this->money = 0;
 
    this->type = type;
    this->money = money;
}

Product.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef PRODUCT_H
#define PRODUCT_H
#include "Unit.h"
 
class Product
{
private:
    float count;
    float prize;
    int type; //Тип продукта: (0 - Work / 1 - Food / 2 - Ferrum / 3 - Machine / 4 - PMaterials / 5 - Energy)
    Unit *reference;
...


Product.cpp:


C++
1
2
3
4
5
6
7
8
9
#include "Product.h"
 
Product::Product(int type, float count, float prize, Unit *reference)
{
    this->type = type;
    this->count = count;
    this->prize = prize;
    this->reference = reference;
}


Values.h (Только первые строчки, кончается он на #endif):

C++
1
2
#ifndef VALUES_H
#define VALUES_H

Вот и все файлы
0
16079 / 8681 / 2120
Регистрация: 30.01.2014
Сообщений: 14,960
11.03.2019, 18:16 7
Alex_fmv, нет, нас интересует что из себя представляет в этих файлах сущность MWork_FC.
1
2 / 2 / 0
Регистрация: 18.09.2016
Сообщений: 86
11.03.2019, 18:18  [ТС] 8
Цитата Сообщение от nd2 Посмотреть сообщение
это всё мои переменные из файла Values.h
Тут действительно ничего интересного


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#ifndef VALUES_H
#define VALUES_H
 
 
float MFood = 1;
float MEnergy_W = 1;
float MWork_FC = 1;
float MMachine_FC = 1;
float MProd = 1;
float MWork_M = 1;
float MWork_MF = 1;
float MFerrum = 1;
float MEnergy_MF = 1;
float MWork_F = 1;
float MMachine_F = 1;
float MEnergy_F = 1;
float MWork_E = 1;
float MMachine_E = 1;
 
 
float NFood = 1;
float NEnergy_W =1;
float NWork_FC = 1;
float NProd = 1;
float NMachine_FC;
float NWork_M = 1;
float NWork_MF = 1;
float NFerrum = 1;
float NEnergy_MF = 1;
float NWork_F = 1;
float NMachine_F = 1;
float NEnergy_F = 1;
float NWork_E = 1;
float NMachine_E = 1;
 
 
 
float EWork = 1;
float EFood = 1;
float EFerrum = 1;
float EMachine = 1;
float EFarm = 1;
float EEnergy = 1;
float EProd = 1;
 
 
 
#endif // VALUES
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
11.03.2019, 18:18 9
Цитата Сообщение от Alex_fmv Посмотреть сообщение
Values.h (Только первые строчки, кончается он на #endif):
Где он подключается?
1
2 / 2 / 0
Регистрация: 18.09.2016
Сообщений: 86
11.03.2019, 18:20  [ТС] 10
Цитата Сообщение от DrOffset Посмотреть сообщение
нас интересует что из себя представляет в этих файлах сущность MWork_FC

float-переменная

Добавлено через 1 минуту
Цитата Сообщение от nd2 Посмотреть сообщение
Где он подключается?

В State.h
0
16079 / 8681 / 2120
Регистрация: 30.01.2014
Сообщений: 14,960
11.03.2019, 18:21 11
Лучший ответ Сообщение было отмечено Alex_fmv как решение

Решение

Alex_fmv, просто возьмите и приложите архив к посту.
Цитата Сообщение от Alex_fmv Посмотреть сообщение
(Только имя в кавычках меняется, это всё мои переменные из файла Values.h)
Ваши переменные имеют внешнее связывание, если они не const.
Поэтому, раз вы надеетесь на телепатию, то вот вам телепатическое решение:

Было:
C++
1
2
3
4
// Values.h
//.....
 
int MWork_FC = 10;
Стало:
C++
1
2
3
4
// Values.h
//.....
 
extern int MWork_FC;
C++
1
2
3
4
// Values.cpp
#include "Values.h"
 
int MWork_FC = 10;
и так для всех.

Добавлено через 53 секунды
Цитата Сообщение от Alex_fmv Посмотреть сообщение
Тут действительно ничего интересного
Это очень интересно, т.к. доказывает, что я все верно вам сказал выше.
1
2 / 2 / 0
Регистрация: 18.09.2016
Сообщений: 86
11.03.2019, 18:22  [ТС] 12
Сейчас буду пробовать, в любом случае не знал о таком, очень интересно
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
11.03.2019, 18:25 13
Цитата Сообщение от Alex_fmv Посмотреть сообщение
В State.h
А он к нескольким .cpp, вот тебе и множественное определение.

Добавлено через 3 минуты
Цитата Сообщение от Alex_fmv Посмотреть сообщение
не знал о таком, очень интересно
Лафоре "ООП в С++", глава 13, "Многофайловые программы".
1
2 / 2 / 0
Регистрация: 18.09.2016
Сообщений: 86
11.03.2019, 18:28  [ТС] 14
Да, вы меня действительно выручили, спасибо, вся ошибка - сугубо мой недочёт.


Ещё раз спасибо вам и всем кто помогал!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2019, 18:28
Помогаю со студенческими работами здесь

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую классы: − воин;...

visual studio 2012 - ошибка "переопределение типа"
имею head.h #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;Windows.h&gt; #pragma...

Двусвязный список - Error C2011: ElementsList: переопределение типа "struct"
Что я сделал не правильно? typedef struct ElementsList { struct ElementsList *Prev; ...

C2011 переопределение типа "enum" RFMapTool c:\dxsdk\include\d3d8types.h
Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка C2011 _D3DZBUFFERTYPE:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru