Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
neske
1503 / 870 / 84
Регистрация: 26.03.2010
Сообщений: 2,985
#1

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

01.08.2010, 18:11. Просмотров 990. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2010, 18:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обращение к данным класса. (C++):

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

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

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

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

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

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

13
rrrFer
Заблокирован
01.08.2010, 18:25 #2
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
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.08.2010, 18:26 #3
Цитата Сообщение от neske Посмотреть сообщение
Собственно вопроc: Как нам использовать private данные lenght и width, если функциям и так будут передавать значения?
во-первых сделай значения беззнаковыми, ибо отрицательной длина вряд ли сможет быть.
во-вторых за меня уже все сказали, функции вычисления параметра и площади не должны принимать аргументы, а должны работать на основании данных самого класса и просто возвращать значения. функции вычисления параметра и площади я бы сделал константными.
зы. еще добавь методы SetSize и GetSize для управления размерами прямоугольника.
1
rrrFer
Заблокирован
01.08.2010, 18:27 #4
в конце надо конечно выполнить
C++
1
2
    delete t;
    delete tt;
0
neske
1503 / 870 / 84
Регистрация: 26.03.2010
Сообщений: 2,985
01.08.2010, 18:31  [ТС] #5
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
rrrFer
Заблокирован
01.08.2010, 18:32 #6
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
neske
1503 / 870 / 84
Регистрация: 26.03.2010
Сообщений: 2,985
01.08.2010, 18:34  [ТС] #7
rrrFer, спасибо =)
Все понял.

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

Добавлено через 2 минуты
fasked, да
надо больше спать
1
neske
1503 / 870 / 84
Регистрация: 26.03.2010
Сообщений: 2,985
01.08.2010, 18:53  [ТС] #11
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
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
01.08.2010, 19:01 #12
Это значит что эти функции не имеют права изменять данные с которыми они работают ( в данном случаи это lenght и width)
2
rrrFer
Заблокирован
01.08.2010, 19:16 #13
neske, внутри const метода поля класса константны, добавить таким образом const можно чтобы получить сообщение об ошибке от компилятора если вдруг при вычислении площади значение стороны прямоугольника изменится.
1
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.08.2010, 20:22 #14
Цитата Сообщение от rrrFer Посмотреть сообщение
внутри const метода поля класса константны
Это не совсем верно, константен указатель this, а не данные.
1
01.08.2010, 20:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2010, 20:22
Привет! Вот еще темы с ответами:

Доступ дружественного оператора к приватным данным класса - C++
Здравствуйте. тока начал изучение С++; составляю прогу практически по учебнику - реализация класса Стринг при компиляции компилятор...

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

Обращение к элементам класса через [] - C++
Пишу класс для работы с комплексными числами, почти все готово, осталось только 1 задание.

Оператор this и обращение к членам класса - C++
строка this-&gt;b = new B; означает взять вдресс текущего объекта b и выделить под него память?так? class B{ public: int k; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru