Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105

Обращение к данным класса.

01.08.2010, 18:11. Показов 3918. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток.
Начал самостоятельно изучать классы.
Хотел выполнить задание, но возникла первая трудность.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class Rectangle {
public:
    Rectangle ();
    //int Perimeter (int, int);
    //int Area (int, int);
private:
    int lenght;
    int width;
};
 
Rectangle::Rectangle ()
{
    lenght=width=0;
}
 
int main (void)
{
    Rectangle TEST;
 
    return 0;
}
Мы имеет класс прямоугольник. Две функции-элемента: вычисление периметра и вычисление площади.
В каждую передается два значения типа int.
Собственно вопроc: Как нам использовать private данные lenght и width, если функциям и так будут передавать значения?

Просто прошу объяснить. Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.08.2010, 18:11
Ответы с готовыми решениями:

Обращение к данным другого объекта
В одном из методов класса block необходимо обратиться к полю объекта класса game. Пробую передачу объекта по указателю в конструктор, но...

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Обращение к методам класса через указатель на экземпляр класса
Добрый день. Не могу осилить проблему: Описан абстрактный класс. Описаны наследники этого класса уже без абстрактности. Описан...

13
Заблокирован
01.08.2010, 18:25
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
40
41
42
43
44
45
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
 
class Rectangle {
public:
    Rectangle ();
    Rectangle (int l, int w);
    void Set (int l, int w);
    int Perimeter ();
    int Area ();
private:
    int lenght;
    int width;
};
 
Rectangle::Rectangle (){
    lenght=width=0;
}
Rectangle::Rectangle (int l, int w){
    lenght=l;
    width=w;
}
void Rectangle::Set (int l, int w){
    lenght=l;
    width=w;
}
int Rectangle::Perimeter (){
    return 2*(lenght+width);
}
int Rectangle::Area (){
    return lenght*width;
}
int main (void){
    Rectangle *t,*tt;
    t=new Rectangle();
    tt=new Rectangle(2,3);
    t->Set(4,5);
    cout<<t->Area()<<" "<<t->Perimeter()<<endl;
    cout<<tt->Area()<<" "<<tt->Perimeter()<<endl;
    cin.get();
 
    return 0;
}
подойдет?

Добавлено через 5 минут
Цитата Сообщение от neske Посмотреть сообщение
Просто прошу объяснить. Спасибо.
Для задания полей добавлен метов Set и конструктор с параметрами. Функция вычисления площади является методом класса, значит имеет доступ к private полям, поэтому возможно написать просто:
C++
1
return lenght*width;
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
01.08.2010, 18:26
Цитата Сообщение от neske Посмотреть сообщение
Собственно вопроc: Как нам использовать private данные lenght и width, если функциям и так будут передавать значения?
во-первых сделай значения беззнаковыми, ибо отрицательной длина вряд ли сможет быть.
во-вторых за меня уже все сказали, функции вычисления параметра и площади не должны принимать аргументы, а должны работать на основании данных самого класса и просто возвращать значения. функции вычисления параметра и площади я бы сделал константными.
зы. еще добавь методы SetSize и GetSize для управления размерами прямоугольника.
1
Заблокирован
01.08.2010, 18:27
в конце надо конечно выполнить
C++
1
2
    delete t;
    delete tt;
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
01.08.2010, 18:31  [ТС]
rrrFer, спасибо. С вашим вариантом разберусь чуть позже.

Щас я додумал немного, укажите на ошибку мне:

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
40
41
42
43
44
45
#include <iostream>
 
class Rectangle {
public:
    Rectangle ();
    void set (int, int);
    int Perimeter ();
    int Area ();
private:
    int lenght;
    int width;
};
 
Rectangle::Rectangle ()
{
    lenght=width=0;
}
 
Rectangle::set (int l, int w)
{
    lenght=l;
    width=w;
}
 
Rectangle::Perimeter ()
{
    return 2*(lenght+width);
}
 
Rectangle::Area ()
{
    return (lenght*width);
}
 
 
int main (void)
{
    Rectangle TEST;
    TEST.set (5, 10);
 
    std::cout << "Perimeter: " << T.Perimeter << std::endl;
    std::cout << "Area: " << T.Area << std::endl;
 
    return 0;
}
fasked, на счет этого понял, спасибо.

Добавлено через 3 минуты
А зачем в данном варианте память выделяется динамически?
0
Заблокирован
01.08.2010, 18:32
neske,
C++
1
[B]void [/B]Rectangle::set (int l, int w){
пропущено void
C++
1
[B]int [/B]Rectangle::Perimeter (){
пропущено Int и т.д.
C++
1
 std::cout << "Perimeter: " << T.Perimeter << std::endl;
наверное не T а TEST
C++
1
TEST.Perimeter[B]()[/B]
периметр - это функция, значит для вызова нужны скобочки
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
01.08.2010, 18:34  [ТС]
rrrFer, спасибо =)
Все понял.

Добавлено через 42 секунды
C++
1
2
Rectangle (int l, int w);
        void Set (int l, int w);
А зачем вы делали конструктор и функцию с одинаковым назначением?
1
Заблокирован
01.08.2010, 18:35
neske,
А зачем в данном варианте память выделяется динамически?
чтобы использовать конструктор с параметрами. Если использовать Set для установки параметров прямоугольника то можно выделить память статически
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
01.08.2010, 18:37
Цитата Сообщение от rrrFer Посмотреть сообщение
чтобы использовать конструктор с параметрами.
чтобы использовать конструктор с параметрами вовсе не обязательно выделять память динамически
2
Заблокирован
01.08.2010, 18:40
neske,
А зачем вы делали конструктор и функцию с одинаковым назначением
Конструктором установить начальное значение, методом Set изменить значение.

Добавлено через 2 минуты
fasked, да
надо больше спать
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
01.08.2010, 18:53  [ТС]
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
40
41
42
43
44
45
#include <iostream>
 
class Rectangle {
public:
    Rectangle ();
    void set (int, int);
    int Perimeter () const;
    int Area () const;
private:
    size_t lenght;
    size_t width;
};
 
Rectangle::Rectangle ()
{
    lenght=width=0;
}
 
void Rectangle::set (int l, int w)
{
    lenght=l;
    width=w;
}
 
int Rectangle::Perimeter () const
{
    return 2*(lenght+width);
}
 
int Rectangle::Area () const
{
    return (lenght*width);
}
 
 
int main (void)
{
    Rectangle TEST;
    TEST.set (5, 10);
 
    std::cout << "Perimeter: " << TEST.Perimeter () << std::endl;
    std::cout << "Area: " << TEST.Area () << std::endl;
 
    return 0;
}
Ключевое слово const значит, что из функций-методов Perimeter и Area будут возвращены константные значения. Так?
0
34 / 34 / 8
Регистрация: 07.06.2010
Сообщений: 118
01.08.2010, 19:01
Это значит что эти функции не имеют права изменять данные с которыми они работают ( в данном случаи это lenght и width)
2
Заблокирован
01.08.2010, 19:16
neske, внутри const метода поля класса константны, добавить таким образом const можно чтобы получить сообщение об ошибке от компилятора если вдруг при вычислении площади значение стороны прямоугольника изменится.
1
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.08.2010, 20:22
Цитата Сообщение от rrrFer Посмотреть сообщение
внутри const метода поля класса константны
Это не совсем верно, константен указатель this, а не данные.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.08.2010, 20:22
Помогаю со студенческими работами здесь

Обращение в методах класса к полям класса
Добрый вечер! Подскажите пожалуйста правильное обращение в методах класса к полям класса. class X {char name ; double zar; ...

Обьявление методов доступа к данным класса.
Не компилируется программа //Обьявление класса Cat. //Переменные-члены обьявляются закрытыми, а открытые методы доступа ...

Доступ одного класса к данным другого
Здравствуйте. Интересует следующий вопрос: Есть два класса, &quot;Вектор&quot; и &quot;Матрица&quot;. Их реализации содержатся в двух разных файлах....

Сравнение методов доступа к данным класса
Добрый день. Изучаю С++. И маленький перфекционист внутри меня не даёт покоя. Допустим есть класс.В нем находится поле класса типа...

Наследование классов. Доступ к данным базового класса
Здравствуйте! Застрял на задачке... Суть самого задания: Создать класс Car (машина), который характеризуется торговой маркой (строка),...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
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