Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
snxwfall
0 / 0 / 0
Регистрация: 07.02.2019
Сообщений: 2
1

Неразрешенный символ при работе со static переменной

07.02.2019, 13:10. Просмотров 1604. Ответов 4
Метки нет (Все метки)

Уже час сижу сражаюсь с Visual Studio и не понимаю,почему оно отказывается работать.Выдает ошибку:
LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: static int A::z" (?z@A@@2HA)"
Вот код:
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
#include "pch.h"
#include <iostream>
using namespace std;
 
class A
{
public:
    static int z;
    int id;
    A()
    {
        id = z;
        z++;
    }
    void showid()
    {
        cout << id << endl;
    }
    void showz()
    {
        cout << z << endl;
    }
};
 
int main()
{
    cout << "Hello." << endl;
    A a;
    A b;
    A c;
    b.showid();
    c.showz();
    return 0;
}
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2019, 13:10
Ответы с готовыми решениями:

Ошибка при работе со структурами: error LNK2019: ссылка на неразрешенный внешний символ _main
#include&lt;iostream&gt; using namespace std; struct baza_film { char name_film ; char...

Классы.Ключевое слово static - выдает ошибку "неразрешенный внешний символ"
Всем доброго времени суток. Изучаю С++ по Шпаку и по урокам на сайте cppstudio.com, предварительно...

Ошибка неразрешенный внешний символ при подключении curl
Здравствуйте, скомпилил курл, подключил к проекту, но при компиляции проекта выдаёт 4 ошибки, и все...

Неразрешенный внешний символ при вызове методов класса в сторонней программе (dll)
Здравствуйте. Пишу dll для клавиатурного хука. Есть класс, который я написал для работы с файлами....

Ошибка при написании класса: error LNK2019: ссылка на неразрешенный внешний символ
Код: int _tmain(int argc, _TCHAR* argv) { Fraction x, x2, y, y2, fl, res, c; cout &lt;&lt;...

4
L0M
900 / 464 / 236
Регистрация: 01.10.2018
Сообщений: 1,025
Завершенные тесты: 1
07.02.2019, 13:14 2
Инициализацию статической переменной забыли. Добавьте в 24-й строке:
C++
1
int A::z = 0;
1
DrOffset
10920 / 5817 / 1434
Регистрация: 30.01.2014
Сообщений: 9,358
07.02.2019, 13:17 3
Лучший ответ Сообщение было отмечено snxwfall как решение

Решение

snxwfall, определение для переменной нужно. Близкая аналогия - вы объявили метод в классе, а тело ему не написали: получите схожу ошибку.

Добавьте после класса:
C++
1
int A::z;
Или в С++17 можно делать так (что равносильно, если продолжать аналогию с методами, определению метода прямо в теле класса):
C++
1
2
3
4
5
6
class A
{
public:
    inline static int z;
//....
};
0
snxwfall
0 / 0 / 0
Регистрация: 07.02.2019
Сообщений: 2
07.02.2019, 13:20  [ТС] 4
Я думал об этом,но пытался инициализировать ее в 8 строке..Странно как-то работает,но ладно,спасибо
0
DrOffset
10920 / 5817 / 1434
Регистрация: 30.01.2014
Сообщений: 9,358
07.02.2019, 13:41 5
Цитата Сообщение от snxwfall Посмотреть сообщение
Я думал об этом,но пытался инициализировать ее в 8 строке.
Дело не в инициализации, а в определении (т.е. в его отсутствии в вашем случае).
И суть в том, что такая переменная имеет внешнее связывание, поэтому без inline (которого раньше не было для переменных) попытка определить переменную прямо в классе может привести к множественному определению, к нарушению ODR (правило одного определения). Запрет такого синтаксиса был попыткой предотвратить эту проблему.

И хотя позже все равно появились механизмы, которые позволяли обходить схожую проблему для inline-функций и шаблонов (inline и шаблоны - это более молодые фичи, чем static-переменные), по умолчанию менять поведение для статических переменных не стали (т.е. оно сохранилось таким же, каким было для не-inline функций класса). А теперь добавление в С++17 inlinе для переменных по сути выправило ситуацию без потери совместимости. Теперь механизм, который раньше работал для статических переменных в шаблонах (или статических локальных переменных в inline функциях) можно использовать директивно к конкретным переменным.
0
07.02.2019, 13:41
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2019, 13:41

Ошибка при создании шаблонной очереди (LNK2019 ссылка на неразрешенный внешний символ)
Привет :) Помогите найти ошибку при создании шаблонного класса. Искал синтаксис в интернете, всё...

"Ссылка на неразрешенный внешний символ _main в функции" при сборке
В чём может быть проблема и как её устранить! 1. LNK2019 ссылка на неразрешенный внешний символ...

Неразрешенный внешний символ при Opendir ("D://")
Всем привет, имеется код в пару строчек, почему пишет ошибки ?? конкретно эму ненравится это dir...


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

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

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