С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
parikmaher534
38 / 38 / 1
Регистрация: 16.11.2011
Сообщений: 112
#1

Не работает extern для vector - C++

21.08.2012, 14:00. Просмотров 914. Ответов 10
Метки нет (Все метки)

Добрый день всем.
Подскажите пожалуйста в чем беда то?
Есть глобальный vector:

C
1
extern vector<Card> CardList
А дальше в конструкторе я его заполняю.

C
1
2
3
4
5
6
7
for( int i = 0; i < CARDCOUNT; i++ ){
 
    Card element = ...
 
    CardList.push_back(element);
 
};
Так вот в месте пуша ошибка вылазит:
undefined reference to `CardList'

Что может быть? ибо до того как вектор был extern все работало.

Буду благодарен за дельные советы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2012, 14:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает extern для vector (C++):

Не работает функция sort (vector, vector) - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;vector&gt; #include &lt;string&gt; #include &lt;algorithm&gt; using namespace std; class...

Не работает глобальный идентификатор extern - C++
У меня два файла : main.cpp func.cpp во втором файле обьявлена и инициализирована extern int a = 3; Почему в первом файле она...

Использование слова extern для структур - C++
В одном из файлов проекта задана структура: struct TMsgTV { int X,Y; char *Msg; } Далее была объявлена...

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main - C++
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt; #include &lt;stdlib.h&gt; #include &lt;fstream&gt;...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>) - C++
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...

Vector обектов почему не работает? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;fstream&gt; #include...

10
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
21.08.2012, 14:09 #2
parikmaher534, А он где-нибудь есть не extern?
0
parikmaher534
38 / 38 / 1
Регистрация: 16.11.2011
Сообщений: 112
21.08.2012, 14:17  [ТС] #3
Цитата Сообщение от ForEveR Посмотреть сообщение
parikmaher534, А он где-нибудь есть не extern?
Я пока его использую только в этом cpp файле.
Сделал его extern. Дальше он ещё используется в методах для взятия и удаление элементов класса.
Но все это в конкретном cpp файле.

В других местах не работаю с ним.
Я могу выложить пример кода если это поможет - но он на 100 строк)

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
81
82
#include <iostream>
#include <cstdlib>
#include <vector>
#include "Game.h"
#include "Player.h"
#include "Card.h"
 
using namespace std;
 
 
extern const int CARDCOUNT = 8;
 
extern vector<Card> CardList;
 
 
//Game constructor
Game::Game(){
 
    //Card description
    struct cardData{
        int id;
        string type;
        string name;
        int value;
        string icon;
    };
 
    //Predefine cards like array of structure
    cardData cardDataDescription[] = {
        {0, "pika", "", 6, "Гў™¦"},
        {1, "cherva", "", 6, "Гў™¦"},
        {2, "buba", "", 6, "Гў™¦"},
        {3, "trefa", "", 6, "Гў™¦"},
 
        {4, "pika", "", 7, "Гў™¦"},
        {5, "cherva", "", 7, "Гў™ВЈ"},
        {6, "buba", "", 7, "Гў™ВҐ"},
        {7, "trefa", "", 7, "Гў™*"}
    };
 
    //Fill container by cards
    for( int i = 0; i < CARDCOUNT; i++ ){
        Card element(
            cardDataDescription[i].id,
            cardDataDescription[i].type,
            cardDataDescription[i].name,
            cardDataDescription[i].value,
            cardDataDescription[i].icon
        );
        CardList.push_back(element);
    };
 
    //Start game logic
    startGame();
}
 
 
/**
 * Get card from object
 * @param id Index of card object
 * @return object Card object
 */
Card Game::getCardById(int id){
    return CardList.at(id);
};
 
 
/**
 * Remove Card from vector container
 * @param id Id of removing object
 */
void Game::removeCardById(int id){
    CardList.erase(CardList.begin() + (id - 1));
};
 
 
/**
 * Clear screen
 */
void Game::clearWin(){
    cout << "\33[2J";
};
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
21.08.2012, 14:23 #4
parikmaher534, Это все конечно интересно. А вы читали смысл модификатора extern? В частности на тему декларации/определения

A declaration is a definition unless it declares a function without specifying the function’s body (8.4), it
contains the extern specifier (7.1.1) or a linkage-specification 25 (7.5) and neither an initializer nor a function-
body
Так вот
C++
1
extern vector<Card> CardList;
это исключительно декларация, а вот
C++
1
extern vector<Card> CardList = vector<Card>();
будет уже и декларацией и определением.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2012, 14:41 #5
parikmaher534, в этом коде напишите просто:
C++
1
vector<Card> CardList;
Это будет определением для CardList. А в тех файлах, где он потребуется, пишите:
C++
1
extern vector<Card> CardList;
0
parikmaher534
38 / 38 / 1
Регистрация: 16.11.2011
Сообщений: 112
21.08.2012, 16:06  [ТС] #6
Цитата Сообщение от ForEveR Посмотреть сообщение
parikmaher534, Это все конечно интересно. А вы читали смысл модификатора extern? В частности на тему декларации/определения



Так вот
C++
1
extern vector<Card> CardList;
это исключительно декларация, а вот
C++
1
extern vector<Card> CardList = vector<Card>();
будет уже и декларацией и определением.
Да действительно помогло. То есть в extern объект должен быть определен изначально?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2012, 21:25 #7
Цитата Сообщение от parikmaher534 Посмотреть сообщение
То есть в extern объект должен быть определен изначально?
Не должен. Можете отдельно определить. Объявление с определением:
C++
1
vector<Card> CardList;
Только объявление (без определения):
C++
1
extern vector<Card> CardList;
У вас в коде было только объявление, поэтому компилятор и ругался.
Определение, это когда память под переменную выделяется. Должно быть одно. Объявлений сколько угодно. Для этого и применяется слово extern. Для того, чтобы переменная была видна во всех файлах и не было бы множества определений, её определяют в одном файле, а в других объявляют без определения, с помощью extern. Не знаю, зачем ForEveR привёл такой пример, но если, вместе с extern, используется и присваивание, то компилятор extern просто игнорирует.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
21.08.2012, 23:11 #8
alsav22, Собственно я сначала спросил, где объявление без extern - мне ответили, что нету - я привел пример инициализации вместе с extern-ом, как-то так.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2012, 23:15 #9
Цитата Сообщение от ForEveR Посмотреть сообщение
alsav22, Собственно я сначала спросил, где объявление без extern - мне ответили, что нету - я привел пример инициализации вместе с extern-ом, как-то так.
Понятно, но, в данном случае, просто смысл extern теряется.
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
21.08.2012, 23:51 #10
alsav22, Ну да. Но я искренне надеюсь, что человек, пользующийся сим модификатором - понимает его значение и для чего он используется.
1
parikmaher534
38 / 38 / 1
Регистрация: 16.11.2011
Сообщений: 112
22.08.2012, 11:26  [ТС] #11
Спасибо ребята. Я просто только учусь.
0
22.08.2012, 11:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2012, 11:26
Привет! Вот еще темы с ответами:

STL, vector. iterator. как работает? - C++
void invertArrange() //метод инвертирования порядка слов { istringstream ist(operLine);...

Не работает operator<< шаблонного класса Vector - C++
Компилятор выдает ошибку error LNK2019: unresolved external symbol &quot;class std::basic_ostream&lt;char,struct std::char_traits&lt;char&gt; &gt; &amp; __cdecl...

Ошибка [Linker error] undefined reference to `Vector::Vector(int)' - C++
Добрый день. Делал по методички, и почему-то валятся ошибки... файл lab9_main.cpp #include &lt;iostream&gt; #include &quot;Vector.h&quot; int...

vector<Struct2{int,vector<struct1>}> или множественное наследование ... - C++
Здравствуйте! Помогите, пожалуйста. Есть такие данные: typedef struct { int x; int y; // координаты...


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

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

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