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

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

21.08.2012, 14:00. Показов 2899. Ответов 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru