Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2017, 18:14   #1
Ola7
 
Регистрация: 19.04.2016
Сообщений: 5
Вопрос Функции в с++, как писать в .срр и .h файлах

Всем привет! Подскажите, пожалуйста, как правильно описывать функции...я новичок

Это .срр- файл...

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
generateData();
system("pause");
}
//---------------------------------------------------------------------------
AnsiString __fastcall generateData()
{
// тело функции.......
}


Это .h- файл


class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
AnsiString generateData();
};

//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif



При компиляции выдает ошибку:
[Linker Error] Unresolved external 'TForm1::generateData()' referenced from C:\USERS\USER\DESKTOP\UNIT1.OBJ

Ошибок в коде нет...Поэтому вопрос, верно ли описаны функции в этих файлах?Сама структура... И с чем может быть связана ошибка? В интернете не могу найти ответа

Заранее спасибо!
Ola7 вне форума Ответить с цитированием
Старый 18.04.2017, 18:37   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Код:
AnsiString __fastcall TForm1::generateData()
p51x вне форума Ответить с цитированием
Старый 18.04.2017, 19:07   #3
Ola7
 
Регистрация: 19.04.2016
Сообщений: 5
Печаль

Спасибо за помошь! Но теперь такие ошибки...
[C++ Error] Unit1.cpp(28): E2356 Type mismatch in redeclaration of 'TForm1::generateData()'
[C++ Error] Unit1.h(17): E2344 Earlier declaration of 'TForm1::generateData()'
Ola7 вне форума Ответить с цитированием
Старый 18.04.2017, 19:22   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ну, то у вас есть fastcall, то у вас его нет...
waleri вне форума Ответить с цитированием
Старый 18.04.2017, 19:28   #5
Ola7
 
Регистрация: 19.04.2016
Сообщений: 5
По умолчанию

Так есть же все..
Изображения
Тип файла: png 18.04.png (79.7 Кб, 75 просмотров)
Ola7 вне форума Ответить с цитированием
Старый 18.04.2017, 19:31   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Не знаю, я смотрю на первый пост...
waleri вне форума Ответить с цитированием
Старый 18.04.2017, 19:35   #7
Ola7
 
Регистрация: 19.04.2016
Сообщений: 5
По умолчанию

А вы не знаете, в чем тут дело? Как устранить ошибки...
Ola7 вне форума Ответить с цитированием
Старый 18.04.2017, 20:10   #8
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Ola7 Посмотреть сообщение
А вы не знаете, в чем тут дело? Как устранить ошибки...
Ошибки из не понимания сути. А билдер вам автоматом "чтото" делает.

Суть такова, есть 2 разные вещи - объявление и определение. Объявление дает знать что, как-то может выглядеть, например
Код:
void some(int a);
Определения по сути есть лишь "обещание" - "я вам скажу позже, как оно будет работать, но пока пользуйтесь вот такой сигнатурой (лицом)."

Определения исторически помещаются в список в h файлах, т.е. такие файлы - это списки обещаний и как кого узнавать для компилятора.

Объявления конкретно делают вещи и их прототип ("лицо") должны точно совпадать с обещаниями (определенеями), т.е.




Код:
void some(int a)
{ 
   a = a +1;
}
Объявления, обычно, помещаются в СРР файлы, и используются компилятором 1 раз, а "обещания" могут быть использованы много раз и все будут указывать на объявление.


....я не совсем силен в терминах, м.б определение-объявление (слова!) следует тут поменять местами. Но суть такова.

.т.е. в ошибке компилятор говрит вам, что контракт обещаний (h файл) не выполнен ровно 1 раз в cpp файлах.

В самом последнем скрине компилятор говорит, что вы "изменяете контракт", но он отличен от исходного ( так нельзя, контракты должны совпадать, но каждый новый говорит, что вы дадите новое определение в новом в cpp файле).
Под новым и старым следует понимать наследование. Старое, это что изначально компилер знает "TForm", а новое - что вы пишите.
Что конкретно "старое", а что "новое" указанов контракте h файла, в cpp файле вы "исполняете контракт".

Т.о. последняя ошибка говрит что, "мы исполняем котракт TForm1, но то что вы исполняете - вне контракта, такого не обсуждали".

Варианты исправления - "добавить в контракт" (h файл) или менять написание так, чтоб соответствовало контракту из h файла.


раз зашло уж...

private: protected: public:

1 случай ток я могу требовать исполнение
2 я и мои дети -внуки могут требовать
3 все могут требовать

Последний раз редактировалось alexzk; 18.04.2017 в 20:43.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Надо писать функцию для нелинейности одной булевой функции за деньги lampard90 Фриланс 0 08.05.2014 16:09
Исправление ошибки в коде срр! AlekCaHdpyLLlka Помощь студентам 2 24.05.2012 19:50
C++. Две функции в разных файлах мешают друг другу. Крот Помощь студентам 13 21.03.2012 14:56
Построение матрицы на Срр. Zerder Помощь студентам 6 28.10.2011 21:11
помогите с модульным методом программирования(функции в отдельных файлах) pavelstraut Общие вопросы C/C++ 11 20.07.2009 20:52