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

Что-то код выдаёт не так - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
07.10.2009, 16:24     Что-то код выдаёт не так #1
Что-то код выдает неправильно, хотя он и компилится:
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
#include <iostream>
using namespace std;
 
class Vechicle{
    int passengers;
    int fuelcap;
    int mpg;
public:
    Vechicle():passengers(),fuelcap(),mpg() { }
    Vechicle(int p, int f, int m) { }   
    
 
    int  range()
    {
        return mpg * fuelcap;
    }
    int get_passengers() {return passengers;}
    int get_fuelcap()    {return fuelcap;}
    int get_mpg()        {return mpg;}
};
 
int main()
{
    Vechicle minivan(7,16,21);
    Vechicle sportscar(2,14,12);
 
    int range1,range2;
    range1 = minivan.range();
    range2 = sportscar.range();
 
    setlocale(0,"");
    cout<<"Манифургон может перевезти "
        <<minivan.get_passengers()
        <<" пассажиров на расстояние "<<range1
        <<" киллометров. "<<'\n';
 
    cout<<"Спортивный автомобиль  может перевезти "
    <<minivan.get_passengers()
    <<" пассажира на расстояние "<<range2
    <<" киллометров"<<'\n';
 
    cin.get();
}
Добавлено через 13 минут
Всё, понял,нужно было вот так:
C++
1
    Vechicle(int p, int f, int m):passengers(p), fuelcap(f), mpg(m) { }

Вы не объясните зачем нужно вот это:

C++
1
2
3
 int get_passengers() {return passengers;}
        int get_fuelcap()    {return fuelcap;}
        int get_mpg()        {return mpg;}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2009, 16:24     Что-то код выдаёт не так
Посмотрите здесь:

C++ Подскажите что не правильно чему оно не так выводит и по возможности исправьте ошибки вот условие и код программы
C++ Арксинус числа выдаёт непонятно что
C++ Народ гляньте код и подскажите что не так.
C++ Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее?
код, который прекрасно выполняет Code::Blocks не выполняеться в Студии, как сделатьь так чтобы Студия воспринимала этот код?? C++
Ошибки выдаёт ( не пойму причину, что не так? C++
C++ При решении программа выдаёт значение функции, равное 0 или выдаёт ошибку. Что не так?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RazorQ
 Аватар для RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
07.10.2009, 16:31     Что-то код выдаёт не так #2
Цитата Сообщение от Syltan Посмотреть сообщение
Вы не объясните зачем нужно вот это:
Функции доступа к переменным. Как правило, инкапсулируют переменные класса.
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
07.10.2009, 17:16  [ТС]     Что-то код выдаёт не так #3
C++
1
Как правило, инкапсулируют переменные класса.
Что это значит, и как это понимать в данном коде?

Добавлено через 8 минут
2) Если бы эти функции
C++
1
2
3
int get_passengers()  {return passengers;}
    int get_fuelcap()     {return fuelcap;}
    int get_mpg()         {return mpg;}
были описанны за пределами класса, тогда бы мы не получили бы доступ к переменным p,f,m?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.10.2009, 17:21     Что-то код выдаёт не так #4
Цитата Сообщение от Syltan Посмотреть сообщение
C++
1
Как правило, инкапсулируют переменные класса.
Что это значит, и как это понимать в данном коде?
по умолчанию переменные класса private, т.е. напрямую доступа к ним нет, только через обращение к соотв. ф-ям, которые имеют public visibility.

Добавлено через 2 минуты
Цитата Сообщение от Syltan Посмотреть сообщение
C++
1
Как правило, инкапсулируют переменные класса.
Что это значит, и как это понимать в данном коде?

Добавлено через 8 минут
2) Если бы эти функции
C++
1
2
3
int get_passengers()  {return passengers;}
    int get_fuelcap()     {return fuelcap;}
    int get_mpg()         {return mpg;}
были описанны за пределами класса, тогда бы мы не получили бы доступ к переменным p,f,m?
вы и так к ним имеете доступ только на считывание (через эти ф-ии). дать им значения можете только в конструкторе. в принципе этих переменых может вообще не быть в самом классе, значения могут объектом каким-то образом вычисляться, а "снаружи" будет казаться что функция get () возвращает вам значение некой переменной.
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
07.10.2009, 17:53  [ТС]     Что-то код выдаёт не так #5
Я про это имел ввиду,если изменить код,тоесть использовать функции члены класса но он не компилируется
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
#include <iostream>
using namespace std;
 
class Vechicle{
    int passengers;
    int fuelcap;
    int mpg;
public:
    Vechicle():passengers(0),fuelcap(0),mpg(0) { }
    Vechicle(int p, int f, int m):passengers(p), fuelcap(f), mpg(m) { } 
    
 
    int  range()
    {
        return mpg * fuelcap;
    }
    int get_pessengers();
    int get_fuelcap();
    int get_mpg();
 
    
};
 
int Vechicle::get_pessengers()
{
    return passengers;
}
 
int Vechicle::get_fuelcap()
{
    return fuelcap;
}
 
int Vechicle::get_mpg()
{
    return mpg;
}
 
 
int main()
{
    Vechicle minivan(7,16,21);
    Vechicle sportscar(2,14,12);
 
    int range1,range2;
    range1 = minivan.range();
    range2 = sportscar.range();
 
    setlocale(0,"");
    cout<<"Манифургон может перевезти "
        <<minivan.get_pessengers
        <<" пассажиров на расстояние "<<range1
        <<" киллометров. "<<'\n';
 
    cout<<"Спортивный автомобиль  может перевезти "
        <<minivan.get_pessengers
    <<" пассажира на расстояние "<<range2
    <<" киллометров"<<'\n';
 
    cin.get();
}
Добавлено через 22 минуты
Упустил (). Скажите, это получается,что доступ к закрытым переменным класса, можно получить только через функции, и без разницы где они описаны, в самом классе, или за классом, правильно я понял?
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
07.10.2009, 18:36     Что-то код выдаёт не так #6
Цитата Сообщение от Syltan Посмотреть сообщение
Скажите, это получается,что доступ к закрытым переменным класса, можно получить только через функции, и без разницы где они описаны, в самом классе, или за классом, правильно я понял?
Это методы доступа к закрытым полям класса. За пределами класса переменные private и protected не видно. protected видно только в наследниках. Если объявишь эти методы за пределами класса, то будет ошибка из-за того, что компилятор просто не поймет те переменные которые ты хочешь вернуть или изменить. Поэтому они объявляются только в пределах класса. В C# это называется свойствами. Ознакомься с одним из принципов ООП - инкапсуляцией. Так вот эти методы и обеспечивают корректную работу твоего класса и обращение к закрытым полям(элементам скрытым в капсуле) через эти методы(специальные каналы в стенках капсулы)
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
07.10.2009, 19:03  [ТС]     Что-то код выдаёт не так #7
Код
[B]Инкапсуля́ция[/B] — свойство языка программирования, позволяющее объединить данные и код в объект и скрыть реализацию объекта от пользователя.
Хорошо,если возьмём такой код:
C++
1
2
3
4
5
6
7
class A {
 private:
   int a,b;//скрытые свойства
   void Do_Something(void);//скрытый метод.
 public:
   int Return_Something(void); //открытый    интерфейс
 };
Класс А инкапсулирует свойства a, b и метод Do_Something, представляя внешний интерфейс Return_Something.
1)Скажите, реализацию какого объекта мы скрываем от пользователя?
2)
C++
1
позволяющее объединить данные и код в объект
Какой объект, экземпляр закрытого класса приват,созданный в главной функции мэин?
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
07.10.2009, 20:34     Что-то код выдаёт не так #8
Цитата Сообщение от Гради Буч
инкапсуляция, encapsulation. Процесс разделения элементов абстракции, которые образуют ее структуру и поведение. Служит для отделения внешних обязательств объекта от его реализации.
Развивая кусок кода из википедии
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
class A 
{
 private:
   int a,b;//скрытые свойства
   void Do_Something()//скрытый метод.
   {
      if(a != 0 && a != NULL)
         a *= 20;
      else
         std::cout<<"Ошибка!";
      if(b != NULL)
         b += 20;
      else
         std::cout<<"Ошибка!";
   }
 public:
   int Return_Something()//открытый интерфейс.
   // Да только не интерфейс, интерфейс это другое, просто открытый метод
   {
      Do_Something();
      return a + b;
   } 
   A()//конструктор без параметров
   { 
      std::cout<<"Введи a: ", std::cin>>a;
      std::cout<<"Введи b: ", std::cin>>b;
   }
};
int main()
{
   A aObj = new A();//создаем объект
   std::cout<<aObj.Return_Something();//вызываем открытый метод
   aObj.Do_Something();//ошибка! этот метод скрыт
   (aObj.b == 2) ? aObj.a = 3 : aObj.a = 5;//Тоже ошибка
   // потому что нам недоступны эти поля
   return 0;
}
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.10.2009, 21:33     Что-то код выдаёт не так #9
Цитата Сообщение от Syltan Посмотреть сообщение
Код
[B]Инкапсуля́ция[/B] — свойство языка программирования, позволяющее объединить данные и код в объект и скрыть реализацию объекта от пользователя.
Хорошо,если возьмём такой код:
C++
1
2
3
4
5
6
7
class A {
 private:
   int a,b;//скрытые свойства
   void Do_Something(void);//скрытый метод.
 public:
   int Return_Something(void); //открытый    интерфейс
 };
Класс А инкапсулирует свойства a, b и метод Do_Something, представляя внешний интерфейс Return_Something.
1)Скажите, реализацию какого объекта мы скрываем от пользователя?
2)
C++
1
позволяющее объединить данные и код в объект
Какой объект, экземпляр закрытого класса приват,созданный в главной функции мэин?
0. будет неверным говорить, что класс А инкапсулирует свойства а,б и метод до_самтинг(), т.к. нет у этого класса этих свойств. свойства - это то, о чем известно "пользователю" класса. вот например такой класс:

класс кисть {
публик:
цвет гет_цвет ()
кисть (рэд, грин, блу) : р(рэд), г(грин), б(блу)

прайвит:
целое р
целое г
целое б
}

видишь: если создать объект класса кисть, то он будет обладать свойством "цвет", значение которого можно будет получить, используя метод класса "гет_цвет()", хотя на самом деле внутри класса нет переменной "цвет", и пользователю, использующему объект, нет дела до того откуда этот цвет берется.
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
07.10.2009, 21:34  [ТС]     Что-то код выдаёт не так #10
Ваш код M128K145,чего-то не компилится, выдаёт ошибочку:
error C2440: 'initializing' : cannot convert from 'A *' to 'A'

Я вроде так и не получил ответ на 2 вопроса.
1)Инкапсуляция - это,когда я создал объект закрытого класса в функции мэин?
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
07.10.2009, 21:50     Что-то код выдаёт не так #11
Syltan, я писал весь код в редакторе поэтому там могут быть еще ошибки небольшие. Попробуй так
C++
1
2
A *aObj = new A();//создаем объект
std::cout<<aObj->Return_Something();
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
07.10.2009, 22:03  [ТС]     Что-то код выдаёт не так #12
Код
позволяющее объединить данные и код в объект и скрыть реализацию объекта
Инкапсуляция - это,когда я создал объект закрытого класса в функции мэин?
То есть например я объявил в привате функцию
C++
1
2
3
4
5
6
7
class sova{
private:
void YRA(int x) 
{
   sqr(x);
}
};
А затем:
C++
1
2
3
4
5
6
int main()
{ 
   sova T;
T.YRA(7);
 
}
Это называется инкапсуляция?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.10.2009, 22:11     Что-то код выдаёт не так #13
что такое "объект закрытого класса"? чушь какая-то.

инкапсуляция - это когда от того, кто использует объекты класса, скрыта реализация. т.е. реализация "инкапсулирована" в классе, снаружи нет доступа к ней. это удобно тем, что, раз создав удобный пользователю интерфейс, мы можем менять реализацию поведения и внутреннего представления объектов данного класса без необходимости изменять код, в котором объекты данного класса используются.
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
07.10.2009, 22:55  [ТС]     Что-то код выдаёт не так #14
Код
что такое "объект закрытого класса"? чушь какая-то.
Это я неправильно сформулировал.
Ответьте на 12 пост, я не получил так ответа.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
08.10.2009, 06:55     Что-то код выдаёт не так #15
Цитата Сообщение от Syltan
Вы не объясните зачем нужно вот это:
класс сохраняет переменные для самого себя, эти методы позволяют вызывающему, получать значения этих переменных

C++
1
2
3
    int pass;
 
    pass = minivan.get_passengers();
C++
1
2
3
    int pass;
 
    pass = minivan.passengers;
не сработает, так как passengers доступна только в классе (по-дефолту там private для неё выставляется)

иллюстрация

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
 
#include <iostream>
 
using namespace std;
 
int main(void)
{
    class X {
            int something;
        public :
            X(void) {
                something = 3;
            };
            
            int getp(void) {
                return something;
            };
    };
    int p, q;
    
    X obj;
    p = obj.getp();
    //q = obj.something;
    
    cout << p << endl;
 
    return 0;
}

если расскомментировать, она пишет
Код
[guest@station tmp]$ g++ t.cpp -o t
t.cpp: In function ‘int main()’:
t.cpp:9: ошибка: ‘int main()::X::something’ is private
t.cpp:25: ошибка: в данном контексте
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.10.2009, 10:50     Что-то код выдаёт не так #16
Цитата Сообщение от Syltan Посмотреть сообщение
Код
позволяющее объединить данные и код в объект и скрыть реализацию объекта
Инкапсуляция - это,когда я создал объект закрытого класса в функции мэин?
То есть например я объявил в привате функцию
C++
1
2
3
4
5
6
7
class sova{
private:
void YRA(int x) 
{
   sqr(x);
}
};
А затем:
C++
1
2
3
4
5
6
int main()
{ 
   sova T;
T.YRA(7);
 
}
Это называется инкапсуляция?
это не называется инкапсуляцией. это называется нарушением доступа. ф-я объявлена в классе приватной, поэтому доступна только объектам данного класса, а вы ее попытались вызвать ее "снаружи".

вы приходите в ресторан. там есть кухня, но вас туда не пустят, если вы не сотрудник ресторана: туда - приватный доступ. только "членам класса". вы можете взять меню и заказать официанту что-нибудь. а приготовление, как и заказ продуктов, уборка, оплата электричества, газа и пр. "инкапсулированы втутри ресторана", т.е. вы можете догадываться как это функционирует, но не можете в этом поучаствовать. ваш интерфейс: меню и официант. если несъедобное принесли - пожаловаться можете шефу можете (тоже ф-я вашего интерфейса), но пойти и поучать повара вас не пустят. и вообще может там нет никакого электричества. и никакой кухни может тоже нет (а вчера была!). с сегодняшняго дня по четным (а сегодя 4-е) все заказы перенаправляются в соседний ресторан и там готовятся и доставляются по пневмопочте (они оптимизировали реализацию). но вас это не касается: вы заказали, вам принесли, и вы не заметили разницы. потому что реализация инкапсулирована внутри класса "ресторан".
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
08.10.2009, 14:36  [ТС]     Что-то код выдаёт не так #17
Код - это функции-члены класса, в которых описан код.
Данные - это переменные, описанные в самом классе, а не в функциях.
Инкапсуляция - это использование экземпляра класса, то есть объекта, который мы получили из-за объеденения даных и код в класс, и скрываем реализацию объекта от пользователя?
А так правильно?
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
08.10.2009, 15:25     Что-то код выдаёт не так #18
Syltan, инкапсуляция - это не использование объекта!! Инкапсуляция - это сокрытие всего ненужного тебе хлама которое поддерживает нормальную работу твоего объекта и которое не позволяет тебе нарушить её!
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
08.10.2009, 15:29  [ТС]     Что-то код выдаёт не так #19
1)
Код
Код - это функции-члены класса, в которых описан код.
Данные - это переменные, описанные в самом классе, а не в функциях.
Это определение верно?

2) Инкапсуляция - скрытие всех, полей, которые использовались для создания этого объекта?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2009, 15:42     Что-то код выдаёт не так
Еще ссылки по теме:

C++ Код из книги выдаёт ошибку
C++ Не работает код, скажите что не так)
Выдаёт ошибку mbstowcs() , и так с любыми попытками конвертации с anci и с unicode C++
C++ Что в коде ни так? while не работает так, как ожидаю
Преобразовать код так, что бы ввод данных осуществлялся из файла C++

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

Или воспользуйтесь поиском по форуму:
M128K145
Эксперт C++
 Аватар для M128K145
8276 / 3495 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
08.10.2009, 15:42     Что-то код выдаёт не так #20
Syltan, забудь про объект. Нету у тебя его! Просто нету. Не создал его ты еще. И все ООП рухнуло. Если нет объекта, то нет инкапсуляции, падает один из основных принципов и все пора вешаться. НЕТ! Объект такого класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
 public:
   A();
};
A::A()
{
   std::cout<<"Я создан";
}
int main()
{
   A* a = new A();
   return 0;
}
Вот и все что надо для создания объекта. Вот смотри - ты живешь, думаешь, дышишь. Окружающая среда может получить непосредственный доступ к твоим легким, мозгу? Нет! Потому что они скрыты от окружающей среды. Но она может получить к ним с помощью определенных открытых методов(носа, глаз, etc.) И тебе важно как у тебя устроен организм? Нет, поэтому все скрыто от тебя под кожей.
Что такое код и данные относительно ООП? Таких понятий в самом ООП нет.
Yandex
Объявления
08.10.2009, 15:42     Что-то код выдаёт не так
Ответ Создать тему

Метки
инкапсуляция, ООП
Опции темы

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