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

Что-то не так с классом - C++

Восстановить пароль Регистрация
 
kernell_dll
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 9
11.01.2013, 18:18     Что-то не так с классом #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
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
#include <iostream>
#include <string>
using namespace std;
 
class Notation
{
        int radix; //Основание системы счисления
        string num; //Само число
        bool nvalidation(string n);//Из-за неоднозначности функции имеют 
        bool rvalidation(int r, int min = 2, int max = 36); //различные названия
    public:
        void putRadix(); //Ввод основания
        void putNum(); //Ввод числа
        Notation(); //Конструктор, вызывающий предыдущие две функции
        ~Notation();    
};
 
bool Notation::nvalidation(string n) //Проверяем корректность значения
{
    if (10 > n.length())
    {
        cout << "\nНекорректное значение!";
        return true;
    }
    for (int i = 0; i <= 9; i++)
    {
        if (n.find(i) == string::npos)
        {
            continue;
        }
        else
        {
            cout << "\nНекорректное значение!";
            return true;
        }
    }
    return false;
}
 
bool Notation::rvalidation(int r, int min, int max) //Проверяем корректность значения
{ 
    if (r < min || r > max)
    {
        cout << "\nНекорректное значение!";
        return true;
    }
    else
    {
        return false;
    }
}
 
void Notation::putRadix()
{ 
    float radix1;
    bool waft = false;
    while (waft == true)
    {
        cout << "\nВведите основание: ";
        cin >> radix1;
        waft = rvalidation (radix1);
    }
    this -> radix = radix1;
}
 
void Notation::putNum() 
{
    bool waft = false;
    while (waft == true)
    {
    cout << "\nВведите число: ";
    cin >> this -> num;
    waft = nvalidation (num);
    }
}
 
Notation::Notation()
{
    cout << "\n\nЭта программа осуществляет перевод между различными системами счисления";
    this -> putRadix();
    this -> putNum(); 
}
 
Notation::~Notation()
{
    cout << " ", radix, " ", num;
}
                                       
int main()
{
    setlocale(LC_ALL,"Russian"); //Это чтобы в cmd.exe корректно отображалась кириллица
    Notation test;
}
Сам вопрос: что я делаю не так?

Собственная догадка: что-то не так в коде конструктора.
Миниатюры
Что-то не так с классом  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
11.01.2013, 18:22     Что-то не так с классом #2
86 строка не правильный вывод на экран
Цитата Сообщение от kernell_dll Посмотреть сообщение
cout << " ", radix, " ", num;
kernell_dll
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 9
11.01.2013, 18:23  [ТС]     Что-то не так с классом #3
Цитата Сообщение от David Sylva Посмотреть сообщение
86 строка не правильный вывод на экран
Что там неправильного-то?
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
11.01.2013, 18:28     Что-то не так с классом #4
Цитата Сообщение от kernell_dll Посмотреть сообщение
cout << " ", radix, " ", num;
Может так cout << " " << radix << " " << num;
И вообще зачем вы в деструкторе это делаете?

Добавлено через 1 минуту
Откомпилировал, ваш код, ошибка из за того, что переменная radix не проинициализированна в конструкторе.
kernell_dll
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 9
11.01.2013, 18:38  [ТС]     Что-то не так с классом #5
Цитата Сообщение от David Sylva Посмотреть сообщение
Может так cout << " " << radix << " " << num;
И вообще зачем вы в деструкторе это делаете?
Странно, что на это не ругнулся компилятор. Насчёт деструктора, хотел посмотреть, когда он вызывается. Судя по книжке, вызывается тогда, когда объект выходит из "зоны видимости" => должен вызваться по завершению программы. Или я в чём-то неправ?
Добавлено через 1 минуту
Откомпилировал, ваш код, ошибка из за того, что переменная radix не проинициализированна в конструкторе
Её инициализация разве обязательно должна происходить в конструкторе? Переменная radix инициализируется в функции putRadix:
C++
1
this -> radix = radix1;
Добавлено через 4 минуты
Ага! Разобрался, почему не происходит ввода. Это всё из-за строчки 68:
C++
1
bool waft = false;
Нужно ставить флаг true, так как цикл while происходит, если wafl == true.

Помимо этого, нашёл ещё кучу логических ошибок. Доволен и счастлив.
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
11.01.2013, 18:39     Что-то не так с классом #6
Цитата Сообщение от kernell_dll Посмотреть сообщение
Её инициализация разве обязательно должна происходить в конструкторе?
Конструктор для того и нужен, чтобы инициализировать объекты.
Деструкторы вызываются при уничтожении объектов.
Конструкторы при создании.
kernell_dll
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 9
11.01.2013, 18:45  [ТС]     Что-то не так с классом #7
Цитата Сообщение от David Sylva Посмотреть сообщение
Конструктор для того и нужен, чтобы инициализировать объекты.
Деструкторы вызываются при уничтожении объектов.
Конструкторы при создании.
Однако переменная -- не объект! Тем более, данный конструктор всё-таки инициализирует эту переменную, для этого вызывается соответствующая функция.

Хотите сказать, при завершении программы объекты не разрушаются?
StasGamilton
Эксперт по пяченькам
 Аватар для StasGamilton
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
11.01.2013, 18:47     Что-то не так с классом #8
Цитата Сообщение от David Sylva Посмотреть сообщение
ошибка из за того, что переменная radix не проинициализированна в конструкторе
Ошибка? а не warning случайно?
David Sylva
 Аватар для David Sylva
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
11.01.2013, 18:54     Что-то не так с классом #9
Цитата Сообщение от StasGamilton Посмотреть сообщение
Ошибка? а не warning случайно?
Ошибка в контексте данной программы.

Добавлено через 2 минуты
Цитата Сообщение от kernell_dll Посмотреть сообщение
Однако переменная -- не объект!
Цитирую Страуструпа страница 304, раздел 10.4
Некоторые объекты являются локальными переменными, некоторые глобальными переменными, другие входят в состав более крупных объектов других классов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 18:59     Что-то не так с классом
Еще ссылки по теме:

Что не так? C++
что не так? C++
C++ Что не так?

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

Или воспользуйтесь поиском по форуму:
kernell_dll
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 9
11.01.2013, 18:59  [ТС]     Что-то не так с классом #10
Цитата Сообщение от David Sylva Посмотреть сообщение
Некоторые объекты являются локальными переменными, некоторые глобальными переменными, другие входят в состав более крупных объектов других классов.
Извиняюсь, неправильно сформулировал. В данном случае переменная radix -- не объект.
Обект в функции main():
C++
1
Notation test;
Yandex
Объявления
11.01.2013, 18:59     Что-то не так с классом
Ответ Создать тему
Опции темы

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