Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
matxon
4 / 4 / 1
Регистрация: 14.09.2014
Сообщений: 14
#1

Поведение Приватных данных в классах

14.09.2014, 23:34. Просмотров 339. Ответов 6
Метки нет (Все метки)

Привет, всем

я только начинаю изучать С++, для закрепления материалов походу обучения все примеры еще пишу на javascript. И случайно заметил, что приватные данные не всегда приватны как я думал, есть исключения. Может я неправильно понимаю?

Вот код на С++
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
   CARDOBJ.cpp Моделирование Игральной карты
*/
#include <iostream>
 
using namespace std;
 
enum Suit { clubs, diamonds, hearts, spades };
 
const int jack = 11;
const int queen = 12;
const int king = 13;
const int ace = 14;
 
class card 
{
  private: int number;
           Suit suit;
 
  public:  card() {}
           card( int n, Suit s ) : number(n), suit(s) {}
           
           void display();                // обявление методов
           bool isEqual(card);
};
 
    void card::display() {
        if ( number >= 2 && number <= 10 )
            cout << number << " ";
        else {
            switch ( number )
            {
                case jack:  cout << "Валет "; break;
                case queen: cout << "Дама " ; break;
                case king:  cout << "Король "; break;
                case ace:   cout << "Туз "; break;
            }
        }
        
        switch( suit ) 
        {
            case clubs:     cout << "треф "; break;
            case diamonds:  cout << "бубен "; break;
            case hearts:    cout << "червей "; break;
            case spades:    cout << "пик "; break;
        }
    }
    
       // c2.number и c2.suit должен быть недоступен, так как private
    bool card::isEqual( card c2 ) {
        return (number == c2.number && suit == c2.suit) ? true : false;     
       
    }
    
// ************************************************************************************
 
int main() {
    setlocale( 0, "" );
 
    card temp, chozen, prize;       // три карты
    int position;
    
    card card1( 7, clubs );
    card card2( jack, hearts );
    card card3( ace, spades );
    
    cout << "\nКарта1 : " /*<< card1.number */;  
//  error C2248: card::number: невозможно обратиться к private член, объявленному в классе "card"
//  а в методе isEqual() ? ПОЧЕМУ, ПОЧЕМУ, ПОЧЕМУ ???
    card1.display();                           
    cout << "\nКарта2 : ";
    card2.display();
    cout << "\nКарта3 : ";
    card3.display();
    
    prize = card3;
    
    cout << "\nМеняем местами карты ... \n";
    temp = card3;
    card3 = card1;
    card1 = temp;
    
    temp = card3;
    card3 = card2;
    card2 = temp;
    
    temp = card2;
    card2 = card1;
    card1 = temp;
    
    prize.display();
    cout << "? ";
    
    cin >> position;
    switch( position )
    {
        case 1: chozen = card1; break;
        case 2: chozen = card2; break;
        case 3: chozen = card3; break;
    }
    
    if ( chozen.isEqual( prize ))
        cout << "\n Правильно! Вы выиграли ! \n";
    else
        cout << "\n Неверно. Вы проиграли. \n";
        
    cout << "\n Вы выбрали карту: " ;
    chozen.display();
    cout << endl;
    
    return 0;
}
переменные number и suit - они приватные и они соответственно не должны быть доступными в методе isEqual().

этот же код на javascript ведет себя как надо

Javascript
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
   node CARDOBJ.js
   Моделирование Игральной карты
*/
function Card( n, s ) {
    this.number = n;        // нельзя сделать приватным как в С++
    this.suit = s;
    
    this.display = function() {
        return ( this.number + " " + this.suit );
    }
    
    this.isEqual = function( c ) {
        return (this.number == c.number && this.suit == c.suit) ? true : false;  
       // тогда здесь c.number и c.suit будет undefined
    }
}
 
var card1 = new Card( 7, "clubs" );
var card2 = new Card( "jack", "hearts" );
var card3 = new Card( "ace", "spades" );
 
console.log("Karta1: " + card1.display());
console.log("Karta2: " + card2.display());
console.log("Karta3: " + card3.display());
 
var prize = new Card( "ace", "spades" );
 
console.log("Menyaem karty ... ");
 
var temp = card3;
    card3 = card1;
    card1 = temp;
    
    temp = card3;
    card3 = card2;
    card2 = temp;
    
    temp = card2;
    card2 = card1;
    card1 = temp;
    
console.log(prize.display() + "? ");
 
var position = 3;
 
switch( position )
{
    case 1: chozen = card1; break;
    case 2: chozen = card2; break;
    case 3: chozen = card3; break;
}
    
if ( chozen.isEqual( prize ))
    console.log("You WIN!");
else
    console.log("You no WIN");
    
console.log("You chozen: " + chozen.display());
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2014, 23:34
Ответы с готовыми решениями:

Использование статический данных в классах
Добрый день! Помогите, пожалуйста! Есть задача: создать в классе статическое...

Преобразование типов данных в классах
если например есть такой код: class TIME { int a; } TIME object;...

Реализация сравнения данных в массиве в классах
Прошу нравоучения наверн, как организовать можно сравнение веса(weight)...

Нюансы использования динамических массивов в качестве данных-членов в классах
Здравствуйте! Не могу создать массив объектов. Помогите ... class hashTable...

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

6
knf
16 / 16 / 8
Регистрация: 18.09.2012
Сообщений: 184
14.09.2014, 23:47 #2
matxon, isEqual() метод класса card, также как и dispplay(), значит number и suit там доступны.
0
Andrej
И целого heap'а мало
94 / 55 / 17
Регистрация: 31.07.2014
Сообщений: 291
14.09.2014, 23:49 #3
Эээ. Вы пытаетесь понять ООП через JS, не поддерживающий ООП (давайте без холиваров, но приватности в JS нет, то бишь инкапсуляции). И почему card::isEqual() не должен видеть приватное поле? Он же из класса. Методы одного класса, но разных инстансов видят поля друг друга.
0
matxon
4 / 4 / 1
Регистрация: 14.09.2014
Сообщений: 14
15.09.2014, 01:07  [ТС] #4
Цитата Сообщение от Andrej Посмотреть сообщение
Методы одного класса, но разных инстансов видят поля друг друга.
card1 и card2 разные экземпляры класса card. В памяти занимает две отдельные области. Друг от друга не зависит, ничего не наследует. Просто не понятно один экземпляр видит закрытые данные другого экземпляра.
0
alsav22
5441 / 4836 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2014, 02:03 #5
Цитата Сообщение от matxon Посмотреть сообщение
Просто не понятно один экземпляр видит закрытые данные другого экземпляра.
Это в какой строке кода?

Добавлено через 4 минуты
В нестатический метод класса неявно передаётся указатель this на объект, поэтому метод знает какой объект его вызывает.

Добавлено через 12 минут
Это вот здесь?
C++
1
2
3
4
5
// c2.number и c2.suit должен быть недоступен, так как private
bool card::isEqual(card c2) 
{
    return (number == c2.number && suit == c2.suit) ? true : false;     
}
Почему же поля c2 будут недоступны, если вы сами передаёте объект в метод? Приватные поля недоступны извне, а не для метода класса. И видит их не объект, а метод, который общий для всех объектов класса. Методы не принадлежат какому-либо объекту.
0
DrOffset
7970 / 4635 / 1127
Регистрация: 30.01.2014
Сообщений: 7,531
15.09.2014, 08:27 #6
matxon, понять это очень просто. Ты хочешь приватность относительно объектов, а в С++ приватность относительно классов (типов). Вот и все.
0
matxon
4 / 4 / 1
Регистрация: 14.09.2014
Сообщений: 14
15.09.2014, 08:30  [ТС] #7
Всем спасибо. Все понятно.
0
15.09.2014, 08:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2014, 08:30

Классы и получение приватных членов
Всем привет. Есть функция: int CConfiguration::Total(void) { int total;...

Структуры данных. Написать программу, позволяющую определить, есть ли в школе в каких-либо классах однофамильцы
Написать программу, позволяющую определить, есть ли в школе в каких-либо...

Нижнее подчеркивание в именах приватных членов (стиль кодинга)
Довольно часто натыкаюсь на стиль кодинга, когда делают так: class A { int...


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

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

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