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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
#1

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

07.10.2009, 16:24. Просмотров 1580. Ответов 29

Что-то код выдает неправильно, хотя он и компилится:
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++ При решении программа выдаёт значение функции, равное 0 или выдаёт ошибку. Что не так?
Ошибки выдаёт ( не пойму причину, что не так? C++
C++ Не работает код, скажите что не так)
C++ Народ гляньте код и подскажите что не так.
C++ Код Виженера. Не полностью выполняется. Что не так?
Преобразовать код так, что бы ввод данных осуществлялся из файла C++
C++ Почему код не работает хотя ошибок нет? Что-то не так с выделением памяти?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RazorQ
577 / 344 / 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
551 / 504 / 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
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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
551 / 504 / 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
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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
551 / 504 / 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 пост, я не получил так ответа.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2009, 06:55     Что-то код выдаёт не так
Еще ссылки по теме:
C++ Подскажите что не правильно чему оно не так выводит и по возможности исправьте ошибки вот условие и код программы
Выдаёт ошибку mbstowcs() , и так с любыми попытками конвертации с anci и с unicode C++
C++ Код из книги выдаёт ошибку
C++ Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее?
C++ Что в коде ни так? while не работает так, как ожидаю

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

Или воспользуйтесь поиском по форуму:
accept
4821 / 3241 / 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: ошибка: в данном контексте
Yandex
Объявления
08.10.2009, 06:55     Что-то код выдаёт не так
Ответ Создать тему
Опции темы

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