Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
38 / 38 / 6
Регистрация: 16.11.2011
Сообщений: 112

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

21.08.2012, 14:00. Показов 2926. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.08.2012, 14:00
Ответы с готовыми решениями:

extern vector — одна переменная для всех форм
Нужно сделать, чтобы вектор был доступен из 2 форм. Не компилится с ошибкой Unresolved external '_tovar_arr' referenced from \UNIT1.OBJ...

Extern vector.
Надо обьявить extern вектор. В первой форме делаю #include &lt;vcl.h&gt; #pragma hdrstop #include &quot;Unit1.h&quot; #include...

Не работает функция sort (vector, vector)
#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...

10
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2012, 14:09
parikmaher534, А он где-нибудь есть не extern?
0
38 / 38 / 6
Регистрация: 16.11.2011
Сообщений: 112
21.08.2012, 14:17  [ТС]
Цитата Сообщение от 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
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2012, 14:23
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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2012, 14:41
parikmaher534, в этом коде напишите просто:
C++
1
vector<Card> CardList;
Это будет определением для CardList. А в тех файлах, где он потребуется, пишите:
C++
1
extern vector<Card> CardList;
0
38 / 38 / 6
Регистрация: 16.11.2011
Сообщений: 112
21.08.2012, 16:06  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
parikmaher534, Это все конечно интересно. А вы читали смысл модификатора extern? В частности на тему декларации/определения



Так вот
C++
1
extern vector<Card> CardList;
это исключительно декларация, а вот
C++
1
extern vector<Card> CardList = vector<Card>();
будет уже и декларацией и определением.
Да действительно помогло. То есть в extern объект должен быть определен изначально?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2012, 21:25
Цитата Сообщение от parikmaher534 Посмотреть сообщение
То есть в extern объект должен быть определен изначально?
Не должен. Можете отдельно определить. Объявление с определением:
C++
1
vector<Card> CardList;
Только объявление (без определения):
C++
1
extern vector<Card> CardList;
У вас в коде было только объявление, поэтому компилятор и ругался.
Определение, это когда память под переменную выделяется. Должно быть одно. Объявлений сколько угодно. Для этого и применяется слово extern. Для того, чтобы переменная была видна во всех файлах и не было бы множества определений, её определяют в одном файле, а в других объявляют без определения, с помощью extern. Не знаю, зачем ForEveR привёл такой пример, но если, вместе с extern, используется и присваивание, то компилятор extern просто игнорирует.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2012, 23:11
alsav22, Собственно я сначала спросил, где объявление без extern - мне ответили, что нету - я привел пример инициализации вместе с extern-ом, как-то так.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2012, 23:15
Цитата Сообщение от ForEveR Посмотреть сообщение
alsav22, Собственно я сначала спросил, где объявление без extern - мне ответили, что нету - я привел пример инициализации вместе с extern-ом, как-то так.
Понятно, но, в данном случае, просто смысл extern теряется.
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2012, 23:51
alsav22, Ну да. Но я искренне надеюсь, что человек, пользующийся сим модификатором - понимает его значение и для чего он используется.
1
38 / 38 / 6
Регистрация: 16.11.2011
Сообщений: 112
22.08.2012, 11:26  [ТС]
Спасибо ребята. Я просто только учусь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.08.2012, 11:26
Помогаю со студенческими работами здесь

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

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

Спецификатор extern для прототипов функций
accept, ну видимо хочет человек понять как разбивать сорц на единицы трансляции. Это верно. Nickstery, в header.h перед описанием...

Для чего может понадобиться extern class
Что дает такая конструкция? extern class Class {};

Почему в билдер extern "C" не работает?
Привет всем, у меня вопрос, почему в билдер(XE2) extern linkage не работает? void __fastcall TForm47::Button2Click(TObject *Sender) { ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru