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

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

Восстановить пароль Регистрация
 
parikmaher534
38 / 38 / 1
Регистрация: 16.11.2011
Сообщений: 112
21.08.2012, 14:00     Не работает extern для vector #1
Добрый день всем.
Подскажите пожалуйста в чем беда то?
Есть глобальный 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 все работало.

Буду благодарен за дельные советы.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2012, 14:09     Не работает extern для vector #2
parikmaher534, А он где-нибудь есть не extern?
parikmaher534
38 / 38 / 1
Регистрация: 16.11.2011
Сообщений: 112
21.08.2012, 14:17  [ТС]     Не работает extern для vector #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";
};
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2012, 14:23     Не работает extern для vector #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>();
будет уже и декларацией и определением.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2012, 14:41     Не работает extern для vector #5
parikmaher534, в этом коде напишите просто:
C++
1
vector<Card> CardList;
Это будет определением для CardList. А в тех файлах, где он потребуется, пишите:
C++
1
extern vector<Card> CardList;
parikmaher534
38 / 38 / 1
Регистрация: 16.11.2011
Сообщений: 112
21.08.2012, 16:06  [ТС]     Не работает extern для vector #6
Цитата Сообщение от ForEveR Посмотреть сообщение
parikmaher534, Это все конечно интересно. А вы читали смысл модификатора extern? В частности на тему декларации/определения



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

C++ Не работает функция sort (vector, vector)
C++ Vector обектов почему не работает?
Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>) C++

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

Или воспользуйтесь поиском по форуму:
parikmaher534
38 / 38 / 1
Регистрация: 16.11.2011
Сообщений: 112
22.08.2012, 11:26  [ТС]     Не работает extern для vector #11
Спасибо ребята. Я просто только учусь.
Yandex
Объявления
22.08.2012, 11:26     Не работает extern для vector
Ответ Создать тему
Опции темы

Текущее время: 02:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru