1 / 1 / 1
Регистрация: 08.04.2014
Сообщений: 31
|
||||||
1 | ||||||
Классы.Ключевое слово static - выдает ошибку "неразрешенный внешний символ"09.04.2014, 00:39. Показов 16329. Ответов 23
Метки нет (Все метки)
Всем доброго времени суток.
Изучаю С++ по Шпаку и по урокам на сайте Кликните здесь для просмотра всего текста
cppstudio.com
Со всеми темами прорываюсь вперед без особых затруднений, дошел до изучения классов, начали появляться вопросы, вот решил найти себе пристанище для ответов. По первому же запросу в гугле попал сюда =) Ну да ладно...вообщем плохо разобрался со статической переменной static, точней понимаю, что она создаётся один раз, содержит последнее, внесённое в неё значение... а дальше, работа с классами и оператором расширения области действия :: очень запутался... На данный момент вот такая проблема. Visual studio 2013 выдаёт такие ошибки. Мои догадки: -из-за того, что интерфейс и реализация в одном файле... -из-за компилятора, вставляю стандартный код, который был приведён для примера, выдаёт такие же ошибки.
0
|
09.04.2014, 00:39 | |
Ответы с готовыми решениями:
23
Не могу запустить программку компилятор выдаёт ошибку error LNK2019: ссылка на неразрешенный внешний символ Выдает ошибку "ссылка на неразрешенный внешний символ _main" Ссылка на неразрешенный внешний символ (классы) Классы и методы, error LNK2001: неразрешенный внешний символ |
54 / 53 / 5
Регистрация: 14.08.2012
Сообщений: 252
|
|
09.04.2014, 00:47 | 2 |
Для статических переменных нужно делать разрешение символа, т.е. написать вне класса:
int AB::a; int AB::b; Т.к. по сути статические переменные не принадлежат классу. Так что ваши догадки пока неверны)
1
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
||||||
09.04.2014, 00:59 | 3 | |||||
Они принадлежат классу, но не принадлежат объекту.
garjo_099, А необходимость вынесения определения переменных точно такая же, как необходимость определения объявленных в классе функций. То есть семантически вот эти записи связаны:
1
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
09.04.2014, 01:11 | 4 |
garjo_099, под поля класса, память, при объявлении класса, не выделяется. Память под них выделяется при создании объектов класса, но так как статические переменные класса не принадлежат объектам, то память под них необходимо выделить отдельно (определить эти переменные вне класса).
0
|
8 / 8 / 2
Регистрация: 21.11.2013
Сообщений: 22
|
|||||||||||
09.04.2014, 01:17 | 5 | ||||||||||
статические классы члены и методы класса относяться к классу в целом, а не к отдельному объекту
статический член класса существует в единственном экземляре, независимо оттого, созданы ли объекты класса и сколько статический метод класса можно вызвать, даже если нет ни одного экземпляра класса ( допустим у тебя в классе дата есть такой метод getCurrentDate но если он не статический то что бы допустим узнать текущию дату тебе нужно создать объект в мейне ну вот такие вещи и делают статикой что бы не создавать объект)
зачем нам нужно объявлять переменные типа дата если мы просто хотим узнать текущую дату
0
|
54 / 53 / 5
Регистрация: 14.08.2012
Сообщений: 252
|
|
09.04.2014, 01:59 | 6 |
Не совсем так. Возможно я неправильно выразился.
Статические данные класса по сути - глобальные переменные с видимостью в namespace класса. Статические члены данных не является частью объектов заданного типа класса; они отдельные объекты. В результате объявление статического члена данных не является определением. Элемент данных объявлен в области класса, но определение выполняется в области файла. Как-то так.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
09.04.2014, 08:24 | 7 |
Storage duration и принадлежность чему-либо в С++ понятия независимые. Если нечто объявлено внутри функции - оно принадлежит функции. Если нечто объявлено внутри namespace - оно принадлежит namespace. Если нечто объявлено внутри класса - оно принадлежит классу, в частности доступ к static полям все так же разрешается спецификаторами доступа. Так что мое определение вполне верное.
Именно об этом я и написал и про определение и объявление тоже.
0
|
1 / 1 / 1
Регистрация: 08.04.2014
Сообщений: 31
|
||||||
09.04.2014, 16:36 [ТС] | 8 | |||||
переделал код, и он показывает, что переменная в каждом экземпляре класса (при создании большого количества объектов класса) хранит последние внесённые в неё данные.
anonymous_, ага спасибо, вроде немножко разтуманилось. Добавлено через 4 минуты И ещё вопрос. Из-за чего лучше объявлять определение за интерфейсом класса???
0
|
54 / 53 / 5
Регистрация: 14.08.2012
Сообщений: 252
|
|
09.04.2014, 16:44 | 9 |
Не просто за интерфейсом, а лучше в отдельном cpp файле. Почитайте про раздельную компиляцию. Когда есть h-файл и его реализация в cpp-файле можно конечному пользователю поставлять только интерфейс в h-файле и скомпилированный cpp-файл, т.е. не выдавать исходные коды.
0
|
1 / 1 / 1
Регистрация: 08.04.2014
Сообщений: 31
|
|
09.04.2014, 20:09 [ТС] | 10 |
Подскажите алгоритм как реализовать, ввод даты допустим, через точку в формате дд.мм.гггг
Добавлено через 9 минут Через разбор строки наверное будет самый простой способ... Добавлено через 42 минуты а точней преобразовать строку дд.мм.гггг в числа и разбить в структуру или по отдельным переменным без точки.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
09.04.2014, 20:11 | 11 |
garjo_099, scanf такое может
0
|
1 / 1 / 1
Регистрация: 08.04.2014
Сообщений: 31
|
|
09.04.2014, 20:33 [ТС] | 12 |
от примера не отказался бы =)))
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
||||||
09.04.2014, 21:12 | 13 | |||||
0
|
1 / 1 / 1
Регистрация: 08.04.2014
Сообщений: 31
|
||||||
10.04.2014, 01:34 [ТС] | 14 | |||||
Написал код, только сильно не пинайте и громко не смейтесь=)) программка чисто для практики, писал код собственными алгоритмами, построенные в моей голове на основе того, что знаю на данный момент, никуда не подглядывая. Вообщем цель перевести строку даты в целочисленные тип данных. Помогите найти ошибки, с функцией, что-то не так и с оператором gets в main функции, не запрашивает повторный ввод, код компилится но выдаёт ошибку.
0
|
1 / 1 / 1
Регистрация: 08.04.2014
Сообщений: 31
|
|
10.04.2014, 10:54 [ТС] | 16 |
0
|
1 / 1 / 1
Регистрация: 08.04.2014
Сообщений: 31
|
|
10.04.2014, 11:05 [ТС] | 18 |
alsav22, ты вводишь дату, ввёл неправильно, цикл спрашивает ещё будете вводить или нет, если да то уже не срабатывает ввод даты, а опять же к этому месту выбора в цикле, скомпилируй код и просто посмотри
0
|
1 / 1 / 1
Регистрация: 08.04.2014
Сообщений: 31
|
|
10.04.2014, 11:51 [ТС] | 20 |
Да. Можно объяснить почему без добавления функции get() не работало. А с функцией, что? не подскажите?
0
|
10.04.2014, 11:51 | |
10.04.2014, 11:51 | |
Помогаю со студенческими работами здесь
20
Помогите устранить ошибку: ссылка на неразрешенный внешний символ Исправить ошибку LNK2019: ссылка на неразрешенный внешний символ (InternetCheckConnection и WinAPI) Компилятор выдает ошибку, LNK2019 ссылка на неразрешенный внешний символ Не могу исправить ошибку средства Link: ссылка на неразрешенный внешний символ Ссылка на неразрешенный внешний символ, неразрешенный внешний элемент Шаблонные классы и ошибка линковки "Ссылка на неразрешенный внешний символ" Есть проблема, при запуску программы выдают вот такую ошибку: ссылка на неразрешенный внешний символ "int Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |