Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
1

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

07.10.2009, 16:24. Показов 2402. Ответов 29

Author24 — интернет-сервис помощи студентам
Что-то код выдает неправильно, хотя он и компилится:
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;}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2009, 16:24
Ответы с готовыми решениями:

При решении программа выдаёт значение функции, равное 0 или выдаёт ошибку. Что не так?
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cmath&gt; using namespace std; long Fact(short...

Выдаёт ошибку, пишет что слишком мало аргументов в функции Per, что не так, подскажите
#include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; int St (int x) { if (x==0) ...

После удаления компонента ComboBox выдает сообщение, что с ним что-то не так, хотя его нигде в этом файле нет
Unresolved external '__fastcall TForm_Vse::ComboBox_DolgnostChange(System::TObject *)' referenced...

Выдает ошибку. что не так?
Hello! Решаю задачу с книги &quot;Компьютерное моделирование физических процессов в пакете Matlab&quot; ...

29
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
07.10.2009, 16:31 2
Цитата Сообщение от Syltan Посмотреть сообщение
Вы не объясните зачем нужно вот это:
Функции доступа к переменным. Как правило, инкапсулируют переменные класса.
0
241 / 9 / 7
Регистрация: 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?
0
556 / 510 / 25
Регистрация: 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 () возвращает вам значение некой переменной.
0
241 / 9 / 7
Регистрация: 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 минуты
Упустил (). Скажите, это получается,что доступ к закрытым переменным класса, можно получить только через функции, и без разницы где они описаны, в самом классе, или за классом, правильно я понял?
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
07.10.2009, 18:36 6
Цитата Сообщение от Syltan Посмотреть сообщение
Скажите, это получается,что доступ к закрытым переменным класса, можно получить только через функции, и без разницы где они описаны, в самом классе, или за классом, правильно я понял?
Это методы доступа к закрытым полям класса. За пределами класса переменные private и protected не видно. protected видно только в наследниках. Если объявишь эти методы за пределами класса, то будет ошибка из-за того, что компилятор просто не поймет те переменные которые ты хочешь вернуть или изменить. Поэтому они объявляются только в пределах класса. В C# это называется свойствами. Ознакомься с одним из принципов ООП - инкапсуляцией. Так вот эти методы и обеспечивают корректную работу твоего класса и обращение к закрытым полям(элементам скрытым в капсуле) через эти методы(специальные каналы в стенках капсулы)
1
241 / 9 / 7
Регистрация: 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
позволяющее объединить данные и код в объект
Какой объект, экземпляр закрытого класса приват,созданный в главной функции мэин?
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
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;
}
0
556 / 510 / 25
Регистрация: 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. будет неверным говорить, что класс А инкапсулирует свойства а,б и метод до_самтинг(), т.к. нет у этого класса этих свойств. свойства - это то, о чем известно "пользователю" класса. вот например такой класс:

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

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

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

Я вроде так и не получил ответ на 2 вопроса.
1)Инкапсуляция - это,когда я создал объект закрытого класса в функции мэин?
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
07.10.2009, 21:50 11
Syltan, я писал весь код в редакторе поэтому там могут быть еще ошибки небольшие. Попробуй так
C++
1
2
A *aObj = new A();//создаем объект
std::cout<<aObj->Return_Something();
0
241 / 9 / 7
Регистрация: 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);
 
}
Это называется инкапсуляция?
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.10.2009, 22:11 13
что такое "объект закрытого класса"? чушь какая-то.

инкапсуляция - это когда от того, кто использует объекты класса, скрыта реализация. т.е. реализация "инкапсулирована" в классе, снаружи нет доступа к ней. это удобно тем, что, раз создав удобный пользователю интерфейс, мы можем менять реализацию поведения и внутреннего представления объектов данного класса без необходимости изменять код, в котором объекты данного класса используются.
0
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
07.10.2009, 22:55  [ТС] 14
Код
что такое "объект закрытого класса"? чушь какая-то.
Это я неправильно сформулировал.
Ответьте на 12 пост, я не получил так ответа.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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: ошибка: в данном контексте
1
556 / 510 / 25
Регистрация: 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-е) все заказы перенаправляются в соседний ресторан и там готовятся и доставляются по пневмопочте (они оптимизировали реализацию). но вас это не касается: вы заказали, вам принесли, и вы не заметили разницы. потому что реализация инкапсулирована внутри класса "ресторан".
1
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
08.10.2009, 14:36  [ТС] 17
Код - это функции-члены класса, в которых описан код.
Данные - это переменные, описанные в самом классе, а не в функциях.
Инкапсуляция - это использование экземпляра класса, то есть объекта, который мы получили из-за объеденения даных и код в класс, и скрываем реализацию объекта от пользователя?
А так правильно?
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
08.10.2009, 15:25 18
Syltan, инкапсуляция - это не использование объекта!! Инкапсуляция - это сокрытие всего ненужного тебе хлама которое поддерживает нормальную работу твоего объекта и которое не позволяет тебе нарушить её!
0
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
08.10.2009, 15:29  [ТС] 19
1)
Код
Код - это функции-члены класса, в которых описан код.
Данные - это переменные, описанные в самом классе, а не в функциях.
Это определение верно?

2) Инкапсуляция - скрытие всех, полей, которые использовались для создания этого объекта?
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
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.) И тебе важно как у тебя устроен организм? Нет, поэтому все скрыто от тебя под кожей.
Что такое код и данные относительно ООП? Таких понятий в самом ООП нет.
1
08.10.2009, 15:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2009, 15:42
Помогаю со студенческими работами здесь

что не так в программе, выдает ошибку...
помогите разобраться, пожалуйста, что не так?

Что не так, почему ошибку выдает?
namespace ConsoleApp31 { class Program { static void Main(string args) ...

Программа выдает ошибки, что не так?
1 форма Option Explicit Dim H As String Dim W As String Dim L As Integer Dim j As Integer...

Что я не так делаю? Выдает ошибку
Делаю проект с модулем. Все сделал, а ошибку выдает. unit Unit1; interface uses Windows,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru