Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
#1

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

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

Доброго времени суток.

Просидев 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


Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2014, 00:22     Множественное определение переменной
Посмотрите здесь:

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

Определение переменной в цикле - C++
Есть скажем такая конструкция. while ( условие ) { int x; int y = 0; } 1) Что здесь будет происходить с...

Определение типа переменной - C++
#include &lt;iostream&gt; #include &lt;typeinfo&gt; int main() { int t = 10; std::cout &lt;&lt; typeid(t).name() &lt;&lt; std::endl; if...

Определение переменной внутри цикла - C++
Кусочек кода #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;fstream&gt; int main() { const int size = 3; int j =...

Определение значения переменной в цикле - C++
В данной функции переменная k должна быть равна position в начале цикла,а когда отлаживаю программу,то k инициируется совершенно другим...

Множественное наследование - C++
Описать два базовых класса с защищенной переменной типа char (в первом - фамилия, во втором - имя). В первом из них описать функцию...

Множественное наследование - C++
По этой схеме нужно сделать множественное наследование. Вот код:#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newbie666
Заблокирован
19.05.2014, 00:26     Множественное определение переменной #2
Цитата Сообщение от alexey31415 Посмотреть сообщение
nt lbXIndex = 0;
букву 'i' пропустил - надо Int писать
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
19.05.2014, 00:35  [ТС]     Множественное определение переменной #3
newbie666, это я когда const убирал случайно удалил, типы переменных правильно записаны
newbie666
Заблокирован
19.05.2014, 00:38     Множественное определение переменной #4
ну что, двойной клик по ошибке в студии не даёт ответа на твой вопрос?
на какой строке ошибка?
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
19.05.2014, 00:53  [ТС]     Множественное определение переменной #5
Цитата Сообщение от newbie666 Посмотреть сообщение
на какой строке ошибка?
Строка в которой создаётся переменная, пишет, что впервые создаётся в файле mainwindow.cpp. Но почему он пытается создать несколько раз эти переменные непонятно.
newbie666
Заблокирован
19.05.2014, 01:01     Множественное определение переменной #6
Цитата Сообщение от alexey31415 Посмотреть сообщение
Строка в которой создаётся переменная
Цитата Сообщение от newbie666 Посмотреть сообщение
на какой строке ошибка?
Пфф.....Нц номер строки с ошибкой какой ёкарнейбабай? И в каком файле?
alexey31415
59 / 59 / 3
Регистрация: 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);
}
newbie666
Заблокирован
19.05.2014, 01:16     Множественное определение переменной #8
Цитата Сообщение от alexey31415 Посмотреть сообщение
просто говорит ,что переменная уже была инициализирована в файле mainwindow.cpp
Цитата Сообщение от newbie666 Посмотреть сообщение
Пфф.....Нц номер строки с ошибкой какой ёкарнейбабай?
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
19.05.2014, 01:20  [ТС]     Множественное определение переменной #9
newbie666, указывается открывающая фигурная скобка, что значит, что проблема где-то в создании объектов класса.

Не по теме:

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

Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
19.05.2014, 02:33     Множественное определение переменной #10
alexey31415, всё просто. переменные нельзя определять в h-файлах, т.к. их определение будет дублироваться везде, где этот файл инклудится. Просто убери все переменные из своего h файла.

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

Добавлено через 8 минут
Л.Лафоре "ООП в С++", глава 13: "Многофайловые программы".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2014, 09:14     Множественное определение переменной
Еще ссылки по теме:

Множественное число - C++
Помогите, пожалуйста, написать данную программу или дайте хотя бы дельный совет как её написать Для большинства существительных,...

Множественное наследование - C++
// 4.1.cpp: главный файл проекта. #include &lt;stdafx.h&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;locale&gt; #include...

Множественное наследование - C++
Друзья прошу помочь разобраться, как получить доступ из массива J, к методу (O) из класса (С) #include &lt;iostream&gt; using...

Множественное наследование - C++
Здравствуйте, всем! Я на этом форуме впервые. Пытаюсь изучать С++ самостоятельно. Литература некоторая имеется. Начал изучение с...

Множественное наследование - C++
Доброго времени суток. Есть ряд операций. Логически операции делятся на группы ( к примеру, запрос, ответ, чтение из буфера и .п.). В...


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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
20.05.2014, 09:14     Множественное определение переменной #16
Цитата Сообщение от alexey31415 Посмотреть сообщение
Как я понимаю лишь один раз инициализируется переменная
от твоего понимания это не зависит, читай книги! Уже прочитал про extern?
Yandex
Объявления
20.05.2014, 09:14     Множественное определение переменной
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru