Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
1

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

19.05.2014, 00:22. Показов 3571. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

Просидев n-ое кол-во часов, доделал считай проект и тут вылезли ошибки о multiple definition. Ругается на переменные, определённые в .h файле, в хэдере само собой присутствует конструкция #ifndef #define #endif.
Поэтому не понятно почему ругается компилятор, ведь в случае повторного включения, переменные не будут
созданы снова. Сделав переменные константами всё заработало, но мне неинтересно почему так.

.h файл с переменными
DataStructures.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
#ifndef CDATASTRUCTURES_H
#define CDATASTRUCTURES_H
 
#include <QVector>
#include <QMap>
#include <QStringList>
 
int   CoordCount  = 4;
 
nt   lbXIndex    = 0;
int   lbYindex    = 1;
 
const int   ruXIndex    = 2;
const int   ruYIndex    = 3;
 
const int   MinXCoordValue  = 1;
const int   MaxXCoordValue  = 10;
 
const int   MinYCoordValue  = 1;
const int   MaxYCoordValue  = 10;
 
const int   PortionValue    = 1000;
 
struct Coord {
    Coord() {
        coord.resize(CoordCount);
    }
 
    QVector<int> coord;
};
 
 
 
#endif // CDATASTRUCTURES_H


Case.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#ifndef CASE_H
#define CASE_H
 
#include "DataStructures.h"
 
class CCase
{
public:
    CCase();
 
    ~CCase();
 
    void    SetCountryData(QString name, Coord countryCoord);
 
    void    InitCities();
    void    FindNeighbors();
 
    void    CalculateDays();
    bool    IsOnRange(int i, int j);
 
    QString GetResult();
 
private:
 
    struct City {
        City() {
            Complete = false;
        }
 
        bool IsEmpty() {
            return Balance.isEmpty();
        }
 
        QMap<QString, int>  Balance;
 
        void                DoTransfer();
        void                GetTransfer(QString name, int transfer);
 
        bool                Complete;
        QVector<City*>      Neighbors;
 
 
    };
 
    struct Country {
        Country() {
            Complete    = false;
            Days        = 0;
        }
 
        QString         Name;
 
        Coord           CountryCoord;
        QVector<City*>  Cities;
 
        int     Days;
        bool    Complete;
    };
 
    QVector<Country>    mCountries;
    QStringList         mCountriesNames;
 
    City**              mCities;
 
    int                 mArrayWidth;
    int                 mArrayHeight;
 
    int                 mOffsetX;
    int                 mOffsetY;
 
    enum Constants {
        DefaultBalance  = 1000000,
        PortionValue    = 1000,
        MaxDayCount     = 100000
    };
 
    bool                mComplete;
};
 
#endif // CASE_H


0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2014, 00:22
Ответы с готовыми решениями:

ООР множественное определение конструктора
Доброго времени, народ! Учился по книге Дейтела, и наткнулся на такой пример. Перепечатал, два раза...

ошибка: множественное определение статического члена класса
народ помогите разобраться с проблемой вот код #ifndef BANKACCOUNT_H #define BANKACCOUNT_H...

QtCreator ругается на множественное определение переменной
Всем доброго времени суток. С Qt знаком мало, но фреймворк легок в освоении и пока получается....

Множественное определение
Keil uVision5 ругается на множественное определение функций в файлах tm_stm32f4_usb_vcp.o и main.o....

15
Заблокирован
19.05.2014, 00:26 2
Цитата Сообщение от alexey31415 Посмотреть сообщение
nt lbXIndex = 0;
букву 'i' пропустил - надо Int писать
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
19.05.2014, 00:35  [ТС] 3
newbie666, это я когда const убирал случайно удалил, типы переменных правильно записаны
0
Заблокирован
19.05.2014, 00:38 4
ну что, двойной клик по ошибке в студии не даёт ответа на твой вопрос?
на какой строке ошибка?
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
19.05.2014, 00:53  [ТС] 5
Цитата Сообщение от newbie666 Посмотреть сообщение
на какой строке ошибка?
Строка в которой создаётся переменная, пишет, что впервые создаётся в файле mainwindow.cpp. Но почему он пытается создать несколько раз эти переменные непонятно.
0
Заблокирован
19.05.2014, 01:01 6
Цитата Сообщение от alexey31415 Посмотреть сообщение
Строка в которой создаётся переменная
Цитата Сообщение от newbie666 Посмотреть сообщение
на какой строке ошибка?
Пфф.....Нц номер строки с ошибкой какой ёкарнейбабай? И в каком файле?
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
19.05.2014, 01:14  [ТС] 7
newbie666, просто говорит ,что переменная уже была инициализирована в файле mainwindow.cpp

UIComponents
C++ (Qt)
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
#ifndef UICOMPONENTS_H
#define UICOMPONENTS_H
 
#include <QtGui>
 
#include <QPlainTextEdit>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
 
#include "Logic.h"
 
class UIComponents : public QWidget
{
    Q_OBJECT
public:
    explicit UIComponents(QWidget *pwgt = 0);
 
 
    QVBoxLayout*    GetLayout();
 
public slots:
    void    InputTextChangedHandler();
 
    void    btnVerifyHandler();
    void    btnCalculateHandler();
    void    btnClearHandler();
 
private:
    QPlainTextEdit* mInputEdit;
    QPlainTextEdit* mOutputEdit;
 
    QPushButton*    mbtnVerify;
    QPushButton*    mbtnCalculate;
    QPushButton*    mbtnClear;
 
    QVBoxLayout*    mLayout;
 
    CLogic          mLogicImpl;
};
 
#endif // UICOMPONENTS_H


mainwindow.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
#include "UIComponents.h"
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    int             mWidth;
    int             mHeight;
 
    UIComponents    mUIComponents;
};
 
#endif // MAINWINDOW_H


main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include "mainwindow.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
    return a.exec();
}


Добавлено через 5 минут
Ещё такой вопрос возник. Почему может приложение падать при добавлении переменной в вектор. Необходим свой конструктор копирования?

В строке собственно ошибка
C++ (Qt)
1
mCases.push_back(mCurrentCase);
Привёл код классов

Logic.cpp
C++ (Qt)
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include "Logic.h"
 
#include <QtAlgorithms>
#include <algorithm>
 
 
CLogic::CLogic() :
    mMaxCountriesCount(20),
    mMinCountriesCount(1),
    mCountriesCount(-1),
    mFinishFlag(0)
{
    mCountriesCountReg  = QRegExp("^\\d\\d?$");
    mCountryNameReg     = QRegExp("[A-Za-z]{1,25}");
    mCityCoordReg       = QRegExp("^\\d\\d?$");
}
 
bool CLogic::Verification(QString input) {
    mSplittedString.clear();
 
    mSplittedString = input.split(QRegExp("\\s+"));
 
    auto iter = mSplittedString.constBegin();
 
    VERIFICATION_CODE result;
 
    while(true) {
        result = CheckCountriesCount(iter);
 
        if(result != VALID_COUNTRIES_COUNT) {
 
            if(result == FINISH_VERIFICATION) {
                ShowMessage(result);
                return true;
            }
 
            ShowMessage(result);
            return false;
        }
 
 
        result = CheckCountriesData(iter);
 
        if(result != VALID_COUNTRIES_DATA) {
            ShowMessage(result);
            return false;
        }
    }
}
 
bool CLogic::IsValidIterator(QStringList::const_iterator &iter) {
    if(iter == mSplittedString.end()) {
        return false;
    }
 
 
    return true;
}
 
VERIFICATION_CODE CLogic::CheckCountriesCount(QStringList::const_iterator& iter) {
    if(!IsValidIterator(iter)) {
        return INVALID_END_OF_TEXT;
    }
 
    // returns true if string is matched exactly
    if(mCountriesCountReg.exactMatch(*iter)) {
        mCountriesCount = (*iter).toInt();
 
        // if iter reference to 0
        if(mCountriesCount == mFinishFlag) {
            return FINISH_VERIFICATION;
        }
 
        if(mCountriesCount < mMinCountriesCount ||
           mCountriesCount > mMaxCountriesCount) {
 
            return COUNTRIES_NUMBER_OUT_OF_RANGE;
        }
 
        CCase newCase;
        mCurrentCase = newCase;
 
        ++iter;
 
        return VALID_COUNTRIES_COUNT;
    }
 
    return UNACCEPTABLE_COUNTRIES_COUNT;
}
 
VERIFICATION_CODE CLogic::CheckCountriesData(QStringList::const_iterator &iter) {
 
    for(int i = 0;i < mCountriesCount;++i) {
        if(!IsValidIterator(iter)) {
            return INVALID_END_OF_TEXT;
        }
 
        if(!( mCountryNameReg.exactMatch(*iter) )) {
            // check appear of new case
            if(mCountriesCountReg.exactMatch(*iter)) {
                // don't expected countries data
                if(mCountriesCount == -1) {
                    mCases.push_back(mCurrentCase);
                    return NEW_CASE;
                }
            }
 
            return INVALID_COUNTRY_NAME;
        }
 
        mCountryName = *iter;
 
        ++iter;
 
        int coord = -1;
 
        Coord countryCoord;
 
        for(int j = 0;j < CoordCount;++j) {
            if(!IsValidIterator(iter)) {
                return INVALID_END_OF_TEXT;
            }
 
            if(!(*iter).contains(mCityCoordReg)) {
                return INVALID_CITY_COORD;
            }
 
            coord = (*iter).toInt();
 
            if(j == lbXIndex ||
               j == ruXIndex) {
 
                if(coord < MinXCoordValue ||
                   coord > MaxXCoordValue) {
 
                    return CITY_COORD_OUT_OF_RANGE;
                }
            }
 
            if(j == lbYindex ||
               j == ruYIndex) {
 
                if(coord < MinYCoordValue ||
                   coord > MaxYCoordValue) {
 
                    return CITY_COORD_OUT_OF_RANGE;
                }
            }
 
            countryCoord.coord.push_back(coord);
 
            ++iter;
        }
 
        mCurrentCase.SetCountryData(mCountryName, countryCoord);
    }
 
    mCases.push_back(mCurrentCase);
 
    mCountriesCount = -1;
 
    return VALID_COUNTRIES_DATA;
}


Case.cpp
C++ (Qt)
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
CCase::CCase() :
    mOffsetX(MaxXCoordValue),
    mOffsetY(MaxYCoordValue),
    mArrayWidth(0),
    mArrayHeight(0),
    mComplete(false)
{
}
 
CCase::~CCase() {
    for(int i = 0;i < mArrayWidth;++i) {
        delete mCities[i];
    }
 
    delete mCities;
}
 
void CCase::SetCountryData(QString name, Coord countryCoord) {
    Country country;
 
    country.Name = name;
    country.CountryCoord = countryCoord;
 
    mCountries.push_back(country);
    mCountriesNames.push_back(name);
 
    mOffsetX = qMin(mOffsetX, countryCoord.coord[lbXIndex]);
    mOffsetY = qMin(mOffsetY, countryCoord.coord[lbYindex]);
 
    int newWidth = countryCoord.coord[ruXIndex] - mOffsetX + 1;
    int newHeight = countryCoord.coord[ruYIndex] - mOffsetY + 1;
 
    mArrayWidth = qMax(mArrayWidth, newWidth);
    mArrayHeight = qMax(mArrayHeight, newHeight);
}
0
Заблокирован
19.05.2014, 01:16 8
Цитата Сообщение от alexey31415 Посмотреть сообщение
просто говорит ,что переменная уже была инициализирована в файле mainwindow.cpp
Цитата Сообщение от newbie666 Посмотреть сообщение
Пфф.....Нц номер строки с ошибкой какой ёкарнейбабай?
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
19.05.2014, 01:20  [ТС] 9
newbie666, указывается открывающая фигурная скобка, что значит, что проблема где-то в создании объектов класса.

Не по теме:

не вижу ничего смешного

0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
19.05.2014, 02:33 10
alexey31415, всё просто. переменные нельзя определять в h-файлах, т.к. их определение будет дублироваться везде, где этот файл инклудится. Просто убери все переменные из своего h файла.

Добавлено через 1 минуту
... да, а константы вообще можно не убирать, а использовать вместо них енумы
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2014, 02:51 11
Цитата Сообщение от alexey31415 Посмотреть сообщение
в хэдере само собой присутствует конструкция #ifndef #define #endif.
Поэтому не понятно почему ругается компилятор, ведь в случае повторного включения, переменные не будут
созданы снова.
Это только для одного файла работает.
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
20.05.2014, 02:45  [ТС] 12
Цитата Сообщение от alsav22 Посмотреть сообщение
Это только для одного файла работает.
В смысле?У меня лишь один хедер с этими переменными, где бы я его не включил компилятор посмотрит не определена ли переменная DATA_STRUCTURES_H, если да, то не будет добавлять код из хедера.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
20.05.2014, 02:59 13
alexey31415, ты включаешь хедер в 2 цпп-файла.
В двух цпп файдах объявляется по самостоятельной переменной. => ошибка! множественное определение переменной.
Делай иначе, открой для себя ключевое слово extern!
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
20.05.2014, 03:16  [ТС] 14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В двух цпп файдах объявляется по самостоятельной переменной.
Но с чего бы?Как я понимаю лишь один раз инициализируется переменная.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.05.2014, 04:47 15
Цитата Сообщение от alexey31415 Посмотреть сообщение
В смысле?
В том смысле, что конструкция:
Цитата Сообщение от alexey31415 Посмотреть сообщение
#ifndef #define #endif
защищает от можественных подключений этого хедера к одному файлу. Это же директивы препроцессора, который видит, в каждый момент времени, только один файл. Такая конструкция никак не помешает подключить этот хедер к нескольким .cpp, и ошибку, о множественных определениях (если есть определения в хедере), выдаст уже компоновщик, который видит все файлы. Поэтому и нельзя делать определения в хедерах, которые подключаются к нескольким файлам (исключение - шаблоны).

Добавлено через 8 минут
Л.Лафоре "ООП в С++", глава 13: "Многофайловые программы".
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
20.05.2014, 09:14 16
Цитата Сообщение от alexey31415 Посмотреть сообщение
Как я понимаю лишь один раз инициализируется переменная
от твоего понимания это не зависит, читай книги! Уже прочитал про extern?
0
20.05.2014, 09:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2014, 09:14
Помогаю со студенческими работами здесь

Определение переменной
Помогите определить значение переменной s , после выполнения всех операторов S:=0 n:=5 НЦ для i...

Определение переменной
В общем есть код: A = 2 B = 4 A1 = A2 = A3 = i = 0 while i &lt; 3: A1.append(A+B)

Циклическое определение переменной
Столкнулся я тут с тем, что нужно в теле цикла каждый раз определять новую переменную и присваивать...

определение значение переменной
помогите найти ошибки,плииз,не знаю в чём дело #include &lt;StdAfx.h&gt; #include &lt;iostream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru