Строитель
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
1

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

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

Author24 — интернет-сервис помощи студентам
В помощь начинающим изучать 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2017, 06:38
Ответы с готовыми решениями:

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

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

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

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

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

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

Не по теме:

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


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

Добавлено через 2 минуты
Вот главная страница этих уроков: http://natalia.appmat.ru/C&C++/
0
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
16.03.2017, 09:39 6
Цитата Сообщение от 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
Строитель
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
16.03.2017, 10:23  [ТС] 7
Цитата Сообщение от 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
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
16.03.2017, 10:24 8
Цитата Сообщение от infobos Посмотреть сообщение
Для методов
Вам надо бы определиться, что есть метод.
Обычно методами называют функции-члены класса, а не свободные функции...
Вы же вообще все функции гребете под понятие метода.
0
Строитель
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
16.03.2017, 10:38  [ТС] 9
Цитата Сообщение от GbaLog- Посмотреть сообщение
Вам надо бы определиться, что есть метод.
Обычно методами называют функции-члены класса, а не свободные функции...
Жаль, что существует такое мнение. Я бы хотел, чтобы такого мнения не было. Хотя это написано в книгах по C++, но про свободные методы я не видел в книге.

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

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

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

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

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

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

свободная функция (или фряха) - обычная функция,
которая не имеет к классам никакого отношения.
3
16.03.2017, 12:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2017, 12:58
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru