Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514

Ошибка: error C2129: статическая функция объявлена, но не определена

16.03.2017, 06:38. Показов 4935. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В помощь начинающим изучать C++ хочу подсказать реальную причину этой ошибки. Так как реально в интернете на форумах рассказывается какая-то ерунда по поводу того, что static дает методу работать без объявления типа. Но ошибка из-за другого…

Если у Вас есть сам метод в одном файле file.cpp:
C++
1
2
3
4
static int func() 
{
return 25;
}
И в другом заголовочном файле global.h
C++
1
static int func();//Прототип функции для видимости – это ошибка, так делать не нужно
А вызов метода делается в другом файле MyKod.cpp
C++
1
s=func();
То у Вас появится Ошибка: error C2129: статическая функция объявлена, но не определена

У функции static я нашел пока два назначения:
1. Внутри класса это означает, что метод будет доступен без объявления типа переменной
2. Он служит также для определения видимости переменных и функций. Static означает, что эта функция и переменная будет видна только внутри одного файла.

1. Внутри класса:
C++
1
2
3
4
5
6
7
8
9
class a
    {
    public:
        static int func();
    };
int a::func() 
{
return 25;
}
2. Определение видимости
C++
1
2
3
4
static int func() 
{
return 25;
}

За место static можно поставить для переменной:
Для методов точно не уверен будут ли работать registr и extern. Прототип функции можно объявлять без extern - работать будут.

registr – переменная будет хранится только в регистре. Позволяет не использовать оперативную память. Нужна для ускорения процессов.

extern – переменная является глобальной. Помещается обычно в заголовочный файл, для того, чтобы сделать ее существующей для других файлов. Чтобы компилятор не ругался. Так как эта глобальная переменная объявляется один раз в одном cpp файле. И для каждого другого файла переменная объявляется с extern. Посмотрите мою тему по объявлению глобальных переменных. Результат работы над ошибками по поводу глобальных переменных на с++

static – переменные и методы будут видны только внутри одного файла(.cpp). На других файлах ее не существует. Именно из-за того, что новички ее используют в другом файле и чужой код копируют со значением static и потом с ужасом замечают, что код не работает. А код просто не может работать в другом файле, потому, что static делает видимость методов и переменных только для одного фала(cpp), в котором это объявлено. Это нужно, чтобы отделить методы и переменные от других фалов для уменьшения влияния переменных между файлами (ООП). Если хотите, чтобы метод был доступен в других файлах просто уберите static.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2017, 06:38
Ответы с готовыми решениями:

Ошибка "Функция-член уже определена или объявлена"
Здравствуйте! Делаю класс для работы с векторами (Vector3) При попытке скомпилировать почти для каждого метода выдает ошибку...

Cтатическая функция объявлена, но не определена
Не пойму из-за чего ошибка: статическая функция "int sum(int,int)" объявлена, но не определена main.c #include <stdio.h> ...

Каким образом объявлена и определена функция на С
cm_send(pfrom, mes) int *pfrom; struct cm_mes *mes; { write(pfrom, mes, sizeof(struct cm_mes)); } Вопрос следующий....

10
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
16.03.2017, 07:23
Цитата Сообщение от infobos Посмотреть сообщение
registr – переменная будет хранится только в регистре. Позволяет не использовать оперативную память. Нужна для ускорения процессов.
http://en.cppreference.com/w/cpp/keyword/register
Это ведь устаревшее.

Вы книги, я так понимаю, не читаете?
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
16.03.2017, 07:28  [ТС]
Цитата Сообщение от Nishen Посмотреть сообщение
Вы книги, я так понимаю, не читаете?
{deleted}
Читаю. И как это Вы определяете, что я не читаю книги?
Ну тогда постарайтесь оправдать ваши высказывания.
Что-за привычка, писать коротко и интриговать!?..
Сами напишите определение по русский здесь, а не кидать на английские сайты.
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
16.03.2017, 07:32
Просто манера изложения Вашего материала такова, будто вы по крупицам собираете его на просторах Интернета.

Не по теме:

Цитата Сообщение от infobos Посмотреть сообщение
И как это Вы определяете, что я не читаю книги?
С помощью телепатии.


Цитата Сообщение от infobos Посмотреть сообщение
Сами напишите определение по русский здесь, а не кидать на английские сайты.
Я Вам ничем не обязан, так что будет интересно - перейдёте по ссылке.
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
16.03.2017, 08:22  [ТС]
Для тех кто собирается создавать большие проекты с множеством фалом много чего можно подчерпнуть здесь: http://natalia.appmat.ru/C%26C%2B%2B/lezione9.php
Также описано про область видимости переменных. Написано как организовывать многофайловые коды. Именно по причине того, что много фалов взаимодействуют между собой могут возникать много ошибок у новичков.

Добавлено через 2 минуты
Вот главная страница этих уроков: http://natalia.appmat.ru/C&C++/
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
16.03.2017, 09:39
Цитата Сообщение от infobos Посмотреть сообщение
static делает видимость методов и переменных только для одного фала(cpp), в котором это объявлено.
А у меня не делает, стоит ли менять компилятор???
foo.hpp
C++
1
2
3
4
5
6
#pragma once
 
struct foo
{
  static void bar();
};
foo.cpp
C++
1
2
#include "foo.hpp"
void foo::bar() {}
main.cpp
C++
1
2
3
4
5
6
#include "foo.hpp"
 
int main()
{
  foo::bar();
}
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
16.03.2017, 10:23  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
А у меня не делает, стоит ли менять компилятор???
У Вас это работает в режиме 1. Указал выше. Для методов в структурах и классов - static работает для того, чтобы ваш метод был доступен без объявление типа (класса или структуры)

Для методов созданных без классов и структур, static будет работать только внутри того файла(.cpp), в котором объявлен метод.

Например просто вставьте:
C++
1
static void bar();
не помещая метод в класс и структуру.
Просто голый метод:
C++
1
static void bar();
Ну или:
C++
1
2
3
4
static void bar()
{
x=z;
};
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
16.03.2017, 10:24
Цитата Сообщение от infobos Посмотреть сообщение
Для методов
Вам надо бы определиться, что есть метод.
Обычно методами называют функции-члены класса, а не свободные функции...
Вы же вообще все функции гребете под понятие метода.
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
16.03.2017, 10:38  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
Вам надо бы определиться, что есть метод.
Обычно методами называют функции-члены класса, а не свободные функции...
Жаль, что существует такое мнение. Я бы хотел, чтобы такого мнения не было. Хотя это написано в книгах по C++, но про свободные методы я не видел в книге.

И все таки есть люди, которые пытаются называть все функции и процедуры одним словом: Метод
Я не раз от людей слышал. Тут можно философию копать...

А вот я не смог найти определения свободным процедурам и функциям. Тем более как назвать свободный метод, который будет в себе содержать и процедурные и функциональные процессы?

Добавлено через 2 минуты
Тут можно разделить мнением того, что функция возвращает результат, а процедура нет.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
16.03.2017, 10:46
Цитата Сообщение от infobos Посмотреть сообщение
но про свободные методы я не видел в книге.
Свободными функциями я назвал обычные функции, просто чтобы они хоть как-то от функций-членов отличались. Такого понятия в реальности нет. Ну или есть, но в узких кругах.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.03.2017, 12:58
Цитата Сообщение от infobos Посмотреть сообщение
Жаль, что существует такое мнение. Я бы хотел, чтобы такого мнения не было
формально есть функции и функции-члены классов.
функции-члены классов делятся:
статические функции-члены,
не статические функции-члены.

говорить каждый раз что-то вроде:
"статическая функция-член класса..." - это как то длинно и долго.

поэтому в общеупотребление вошли слэнговые понятия:

метод - не статическая функция-член класса.
статический метод - статическая функция-член класса.

свободная функция (или фряха) - обычная функция,
которая не имеет к классам никакого отношения.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.03.2017, 12:58
Помогаю со студенческими работами здесь

Ошибка...функция не определена
Здравствуйте. Вот начинаю с питоном знакомиться и написал тривиальнейшую программку...до нового года отлично запускалась, сейчас решил...

Ошибка: функция mid не определена
Братва помогите-е-е... Вкраце опишу макрос. Работает под программкой SolidWorks (CAD-программа), берет данные из Excel-левского файла...

Ошибка fatal error LNK1561: точка входа должна быть определена
пробовал добавить библиотеку stdafx.h и менял тип main с void на int не помогает .... подскажите //BitSet.h ...

ошибка:1>LINK : fatal error LNK1561: точка входа должна быть определена
вот текст программы: #include "stdafx.h" #include "iostream" #include "conio.h" #include "math.h" #include "stdio.h" ...

Предупреждение C4240. структура объявлена как private но определена как public
Структура класса А используется как своими же приватными методами, так и другими классами, знающими об А. class A { struct...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru