Форум программистов, компьютерный форум CyberForum.ru

wxDev-C++ и инкапсуляция - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
28.09.2011, 20:01     wxDev-C++ и инкапсуляция #1
Всем привет. Учусь по книжке Дейтелов, дошел до классов. Авторы пропагандируют методику сокрытия ненужных данных, то есть делать 3 файла: *.h (сам класс), *.cpp (элемент-функции класса) и *.cpp (функция main, которая запускает класс).

Например, такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef TIME_H
#define TIME_H
 
// Time class definition
class Time 
{
public:
   Time(); // constructor
   void setTime( int, int, int ); // set hour, minute and second
   void printUniversal(); // print time in universal-time format
   void printStandard(); // print time in standard-time format
private:
   int hour; // 0 - 23 (24-hour clock format)
   int minute; // 0 - 59
   int second; // 0 - 59
}; // end class Time
 
#endif
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
35
36
37
38
39
#include <iostream>
using std::cout;
 
#include <iomanip>
using std::setfill;
using std::setw;
 
#include "Time.h" // include definition of class Time from Time.h
 
// Time constructor initializes each data member to zero.
// Ensures all Time objects start in a consistent state.
Time::Time() 
{ 
   hour = minute = second = 0; 
} // end Time constructor
 
// set new Time value using universal time; ensure that
// the data remains consistent by setting invalid values to zero
void Time::setTime( int h, int m, int s )
{
   hour = ( h >= 0 && h < 24 ) ? h : 0; // validate hour
   minute = ( m >= 0 && m < 60 ) ? m : 0; // validate minute
   second = ( s >= 0 && s < 60 ) ? s : 0; // validate second
} // end function setTime
 
// print Time in universal-time format (HH:MM:SS)
void Time::printUniversal()
{
   cout << setfill( '0' ) << setw( 2 ) << hour << ":" 
      << setw( 2 ) << minute << ":" << setw( 2 ) << second;
} // end function printUniversal
 
// print Time in standard-time format (HH:MM:SS AM or PM)
void Time::printStandard()
{
   cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 ) << ":" 
      << setfill( '0' ) << setw( 2 ) << minute << ":" << setw( 2 )
      << second << ( hour < 12 ? " AM" : " PM" );
} // end function printStandard
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
#include "Time.h" // include definition of class Time from Time.h
 
int main()
{
   Time t; // instantiate object t of class Time
 
   // output Time object t's initial values
   cout << "The initial universal time is ";
   t.printUniversal(); // 00:00:00
   cout << "\nThe initial standard time is ";
   t.printStandard(); // 12:00:00 AM
 
   t.setTime( 13, 27, 6 ); // change time
 
   // output Time object t's new values
   cout << "\n\nUniversal time after setTime is ";
   t.printUniversal(); // 13:27:06
   cout << "\nStandard time after setTime is ";
   t.printStandard(); // 1:27:06 PM
 
   t.setTime( 99, 99, 99 ); // attempt invalid settings
 
   // output t's values after specifying invalid values
   cout << "\n\nAfter attempting invalid settings:"
      << "\nUniversal time: ";
   t.printUniversal(); // 00:00:00
   cout << "\nStandard time: ";
   t.printStandard(); // 12:00:00 AM
   cout << endl;
   return 0; 
} // end main
Попробовал на старой Dev-C++, не получилось. Поставил более новую wxDev-C++, та же история.

Выдаёт что-то вроде
[Linker Error] undefined reference to `Time::Time()'
[Linker Error] undefined reference to `Time:rintUniversal()'
[Linker Error] undefined reference to `Time:rintStandard()'
[Linker Error] undefined reference to `Time::setTime(int, int, int)'
...
ld returned 1 exit status
Как это лечится? Хочу делать как надо.

Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2011, 20:01     wxDev-C++ и инкапсуляция
Посмотрите здесь:

Граф - WxDev C++ C++
wxDev-C++ C++
C++ GL/glut.h на wxDev-C++
Настройка wxdev-cpp C++
C++ Ошибка в wxDev-C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.09.2011, 20:31     wxDev-C++ и инкапсуляция #2
Вообще инкапсуляция это по своей сути несколько другое и заключается в правильном использовании ключевых слов public, protected, private
/////////////////////////////////////////////////////////////////////////////

У тебя по ошибкам видно, что линкёр не может найти функции-методы класса. Они определены в некотром файле, но он у тебя не то, что без имени, он вообще не фигурирует нигде. Его надо подключить. Вот так надо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef TIME_H
#define TIME_H
 
// Time class definition
class Time 
{
public:
   Time(); // constructor
   void setTime( int, int, int ); // set hour, minute and second
   void printUniversal(); // print time in universal-time format
   void printStandard(); // print time in standard-time format
private:
   int hour; // 0 - 23 (24-hour clock format)
   int minute; // 0 - 59
   int second; // 0 - 59
}; // end class Time
 
#endif
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
35
36
37
38
39
#include <iostream>
using std::cout;
 
#include <iomanip>
using std::setfill;
using std::setw;
 
#include "Time.h" // include definition of class Time from Time.h
 
// Time constructor initializes each data member to zero.
// Ensures all Time objects start in a consistent state.
Time::Time() 
{ 
   hour = minute = second = 0; 
} // end Time constructor
 
// set new Time value using universal time; ensure that
// the data remains consistent by setting invalid values to zero
void Time::setTime( int h, int m, int s )
{
   hour = ( h >= 0 && h < 24 ) ? h : 0; // validate hour
   minute = ( m >= 0 && m < 60 ) ? m : 0; // validate minute
   second = ( s >= 0 && s < 60 ) ? s : 0; // validate second
} // end function setTime
 
// print Time in universal-time format (HH:MM:SS)
void Time::printUniversal()
{
   cout << setfill( '0' ) << setw( 2 ) << hour << ":" 
      << setw( 2 ) << minute << ":" << setw( 2 ) << second;
} // end function printUniversal
 
// print Time in standard-time format (HH:MM:SS AM or PM)
void Time::printStandard()
{
   cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 ) << ":" 
      << setfill( '0' ) << setw( 2 ) << minute << ":" << setw( 2 )
      << second << ( hour < 12 ? " AM" : " PM" );
} // end function printStandard

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
#include "Time.h" // include definition of class Time from Time.h
#include "time_.cpp" // include definition of class Time from Time.h
 
int main()
{
   Time t; // instantiate object t of class Time
 
   // output Time object t's initial values
   cout << "The initial universal time is ";
   t.printUniversal(); // 00:00:00
   cout << "\nThe initial standard time is ";
   t.printStandard(); // 12:00:00 AM
 
   t.setTime( 13, 27, 6 ); // change time
 
   // output Time object t's new values
   cout << "\n\nUniversal time after setTime is ";
   t.printUniversal(); // 13:27:06
   cout << "\nStandard time after setTime is ";
   t.printStandard(); // 1:27:06 PM
 
   t.setTime( 99, 99, 99 ); // attempt invalid settings
 
   // output t's values after specifying invalid values
   cout << "\n\nAfter attempting invalid settings:"
      << "\nUniversal time: ";
   t.printUniversal(); // 00:00:00
   cout << "\nStandard time: ";
   t.printStandard(); // 12:00:00 AM
   cout << std::endl;
   return 0; 
} // end main
При чём по-моему без разницы, *h он будет или *.cpp
Насколько я помню, чтобы компилить автоматом все файлы *.cpp без их явного подключения, в Dev-Cpp надо создать ПРОЕКТ и тогда все .cpp файлы проекта будут компилиться по F9

Добавлено через 5 минут
Как в DEV C++ добавить опцию компилятора *cpp?
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
28.09.2011, 20:33  [ТС]     wxDev-C++ и инкапсуляция #3
Всё работает, пасиба
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.09.2011, 20:39     wxDev-C++ и инкапсуляция #4
Цитата Сообщение от kravam Посмотреть сообщение
#include "time_.cpp"
это-то зачем подключать?О_о
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.09.2011, 20:44     wxDev-C++ и инкапсуляция #5
Затем, что в нём определены функции, которые компилятор не видит. Это надо если компилить main.cpp отдельным файлом.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.09.2011, 21:09     wxDev-C++ и инкапсуляция #6
Цитата Сообщение от kravam Посмотреть сообщение
Затем, что в нём определены функции, которые компилятор не видит. Это надо если компилить main.cpp отдельным файлом.
ну дык проще файлы в проект добавить, а то так новичка приучите писать и...
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.09.2011, 21:17     wxDev-C++ и инкапсуляция #7
Как сам умею так и учу. Можете лучше- сделайте лучше. Я оговорил, что дабы компилились все .cpp файлы, нужно собирать проект. На большее не способен. Да и не уверен я, что проект для такого проекта (простите за тафтологию) лучше, нежели отдельный файл с хидерами.
silent_1991
28.09.2011, 22:27
  #8

Не по теме:

Цитата Сообщение от kravam Посмотреть сообщение
инкапсуляция это по своей сути несколько другое и заключается в правильном использовании ключевых слов public, protected, private
Гениально, чё.

kravam
28.09.2011, 22:35
  #9

Не по теме:

Ну я просто умничать не стал. Не это была суть вопроса. Ты-то понимаешь, что я понимаю, что за этими словами стоит!

Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
28.09.2011, 23:00     wxDev-C++ и инкапсуляция #10
vortexx1
Не слушайте насчет инкапсуляции kravam. Его понимание не верно в корне.

Добавлено через 1 минуту
Не знаю, как там Dev-C++ работает, но так делать не надо:
Цитата Сообщение от kravam Посмотреть сообщение
#include "time_.cpp"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2011, 23:06     wxDev-C++ и инкапсуляция
Еще ссылки по теме:

C++ wxDev-C++ 7.3.1 не компилит.
C++ wxDev-C++ непонятно
Ошибка с wxDev C++ C++

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.09.2011, 23:06     wxDev-C++ и инкапсуляция #11
несерьёзно
Yandex
Объявления
28.09.2011, 23:06     wxDev-C++ и инкапсуляция
Ответ Создать тему
Опции темы

Текущее время: 13:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru