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

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

Войти
Регистрация
Восстановить пароль
 
Bobster
Сообщений: n/a
#1

сконструировать класс - C++

31.08.2011, 12:27. Просмотров 872. Ответов 13
Метки нет (Все метки)

Добрый день. Мне надо сконструировать следующий класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class LogicElement {
public:
    // constructors / destructor
    LogicElement(const char *ElementType, int nIpiNmb );
    LogicElement(const LogicElement &);
    ~LogicElement();
    //methods
    void SetInputs(const bool *inputs);
    bool Evaluate();
    void PrintStatus();
private:    
    char *name;// имя элемента  
    int inp_nmb; // количество входов элемента
    bool *inputs;//входные сигналы
};
Но при построении появляется ошибка:
Run-Time Check Failure #3 - The variable 'inputs' is being used without being initialized.
Как правильно ее инициализировать?
Вот код программы:

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
#include "header.h"
#include "stdio.h"
#include "string.h"
 
LogicElement::LogicElement(const char *ElementType, int nIpiNmb ){  
    name = new char[ strlen(ElementType) + 1 ]; 
    strcpy(name, ElementType);
    inp_nmb = nIpiNmb;
    inputs = new bool;
}
 
LogicElement::LogicElement(const LogicElement &q){
    name = new char[ strlen(q.name) + 1 ];
    strcpy(name, q.name);
    inp_nmb = q.inp_nmb;
    inputs = new bool;
}
 
LogicElement::~LogicElement(){
    
    delete[] name;
    inp_nmb = 0;
    delete[] inputs;
}
 
bool LogicElement::Evaluate(){
    bool b;
    int i;
    b=0;
    
    if (name=="AND")
        for (i=0; i<inp_nmb; i++){
            b = b && (*inputs);
            inputs++;
        };
    if (name=="OR")
        for (i=0; i<inp_nmb; i++){
            b = b || (*inputs);
            inputs++;
        };
    if (name=="XOR")
        for (i=0; i<inp_nmb; i++){
            b = (b || (*inputs)) && !(b && (*inputs));
            inputs++;
        };
    if (name=="ANDNEG")
        for (i=0; i<inp_nmb; i++){
            b = !(b && (*inputs));
            inputs++;
        };
    if (name=="ORNEG")
        for (i=0; i<inp_nmb; i++){
            b = !(b || (*inputs));
            inputs++;
        };
    return b;
};
 
void LogicElement::SetInputs(const bool *Inputs){
    int i;
    for (i=0; i<inp_nmb; i++)
        if (i/2==0){
            *inputs=0;
            inputs++;
        }
        else {
            *inputs=1;
            inputs++;
        }
};
 
void LogicElement::PrintStatus(){
    printf("%s %d\n", *name,inp_nmb);
}
 
 
 
 
#include "header.h"
#include "stdio.h"
 
 
int main(){
    char *s;
    s="AND";
    LogicElement x(s,2);
    bool *inputs; 
    x.SetInputs(inputs);
    x.Evaluate();
    x.PrintStatus();
return 0;
};
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2011, 12:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос сконструировать класс (C++):

Нужно сконструировать алгоритм задачи - C++
Добрый день. Задача: Отрезок числовой оси от 0 до 109 покрашен в белый цвет. Затем некоторые части этого отрезка были покрашены в...

Можно ли в поле private сконструировать объект с параметрами другого класса? - C++
Например у меня есть классы Basic и Second. Во 2-м классе есть конструктор с параметрами. Можно ли написать что-то типу такого? class...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами - C++
Здравствуйте! Никак не могу продумать структуру этой программы. Проходим наследование, но я все равно не знаю, как его здесь применить. Как...

Отдельно класс данных, класс формул и главный класс - C++
Здравствуйте! У меня есть три вопроса. Первый вопрос. Скажите пожалуйста! Правильный ли это подход к созданию приложений :...

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число" - C++
Ткма работы создать класс pair (пара чисел); определить метод перемножения полей и операцию сложения пар (a,b)+(c,d) =(a+b,c+d)...

13
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
31.08.2011, 12:33 #2
Bobster, Выделить память?

C++
1
2
        bool *inputs; 
        x.SetInputs(inputs);
Да и потом...

Вы в конструкторе выделяете под один bool память. А удаляете/используете как массив.
0
Bers
Заблокирован
31.08.2011, 13:37 #3
Цитата Сообщение от Bobster Посмотреть сообщение
Run-Time Check Failure #3 - The variable 'inputs' is being used without being initialized.
Ругается, что был объявлен не проинициализированный указатель.
Лечится вот так:

C++
1
2
3
4
5
6
7
8
9
10
int main(){
  char *s;
  s="AND";
  LogicElement x(s,2);
  bool *inputs = NULL; //не забываем инициализировать. 
  x.SetInputs(inputs);
  x.Evaluate();
  x.PrintStatus();
  return 0;
};
0
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2011, 13:59 #4
Bobster, в проекте ещё баги - например светиться ерор на память
После завершения работы приложения память и так освободиться
C++
1
2
3
4
5
6
7
8
LogicElement::~LogicElement()
{
    inp_nmb = 0;  
/*  if(name)
        delete[] name;
    if(inputs)
        delete[] inputs;*/
}
- притом ты выполяешь следующее

char *s ="AND";
strcpy(name, ElementType);т.е
strcpy(name, s);//s - в данном случае const и очистить память после неё не удасться

Чтобі норм печатало - нужно было убрать указатель от переменной name
C++
1
2
3
4
void LogicElement::PrintStatus()
{
    printf("%s %d\n", name,inp_nmb);
}
0
Миниатюры
сконструировать класс  
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
31.08.2011, 14:02 #5
-=ЮрА=-, Вот про освобождение - не стоит плохому людей учить. Деструкторы существуют в том числе для того, чтобы память очищалась.
0
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2011, 14:26 #6
Цитата Сообщение от ForEveR Посмотреть сообщение
Вот про освобождение - не стоит плохому людей учить
- я писал за конкретный случай - человек в strcpy присваивает строковой переменной класса, адрес константной строковой переменной, в данном случае при чистке вылезет баг . Касательно освобождения памяти в общем случае - если память используется 1-разово то при завершении программы операционка сама её очистит, это так же как снимать хук-точку не обязательно, т.к. при закрытии система кое-что и сама делает...
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
31.08.2011, 14:35 #7
- я писал за конкретный случай - человек в strcpy присваивает строковой переменной класса, адрес константной строковой переменной, в данном случае при чистке вылезет баг
Человек предварительно выделяет память для переменной класса. Какой нафиг баг?
0
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2011, 14:43 #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Человек предварительно выделяет память для переменной класса. Какой нафиг баг?
- теперь всмотрелся что баг не на строке а на inputs вылетает, вот он
0
Миниатюры
сконструировать класс  
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
31.08.2011, 15:04 #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Выделить память?
Так он этот переданный указатель и не использует )

Добавлено через 2 минуты
-=ЮрА=-, никаких проверок перед delete/deletel[] делать не нужно.

Добавлено через 3 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- теперь всмотрелся что баг не на строке а на inputs вылетает, вот он
Ну так память-то выделяется при помощи new, а не new[], следовательно и освобождать её надо соответственно.
1
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2011, 15:11 #10
Цитата Сообщение от rangerx Посмотреть сообщение
никаких проверок перед delete/deletel[] делать не нужно.
если так её выделять
C++
1
new char[ strlen(ElementType) + 1 ];
, то да не нужна проверка, а вот для такого варианта выделения всё же нужна
C++
1
new char[ strlen(ElementType) ];
Добавлено через 28 секунд
Цитата Сообщение от rangerx Посмотреть сообщение
так память-то выделяется при помощи new, а не new[]
- за этот пост спасибо, с меня +1
0
asics
Freelance
Эксперт С++
2847 / 1782 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
31.08.2011, 15:28 #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а вот для такого варианта выделения всё же нужна
Такой вариант выделения памяти вообще не корректный, так как нет места на '\0'.

Добавлено через 1 минуту
Да и все равно, проверка не нужна.
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
31.08.2011, 18:17 #12
-=ЮрА=-, перед освобождением памяти в стиле языка C обычно делают следующую проверку
C
1
2
if(p != NULL) // чаще пишут просто if(p)
    free(p);
т.е., если указателю присвоено значение NULL, значит он ни на что не указывает. Другими словами, либо для него забыли вызвать malloc, либо вызов malloc оказался неудачным. Для работы с памятью в стиле C такая проверка перед free обязательна(!). Операторы delete и delete[] такой проверки не требуют, например:
C++
1
2
int* p = NULL;
delete p; // бессмысленно, но допустимо
Цитата Сообщение от Bobster Посмотреть сообщение
if (name=="AND")
C++
1
if(!strcmp(name, "AND"))
0
Сыроежка
Заблокирован
31.08.2011, 18:32 #13
Цитата Сообщение от Bobster Посмотреть сообщение
Добрый день. Мне надо сконструировать следующий класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class LogicElement {
public:
    // constructors / destructor
    LogicElement(const char *ElementType, int nIpiNmb );
    LogicElement(const LogicElement &);
    ~LogicElement();
    //methods
    void SetInputs(const bool *inputs);
    bool Evaluate();
    void PrintStatus();
private:    
    char *name;// имя элемента  
    int inp_nmb; // количество входов элемента
    bool *inputs;//входные сигналы
};
Но при построении появляется ошибка:
Run-Time Check Failure #3 - The variable 'inputs' is being used without being initialized.
Как правильно ее инициализировать?
Вот код программы:

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
#include "header.h"
#include "stdio.h"
#include "string.h"
 
LogicElement::LogicElement(const char *ElementType, int nIpiNmb ){  
    name = new char[ strlen(ElementType) + 1 ]; 
    strcpy(name, ElementType);
    inp_nmb = nIpiNmb;
    inputs = new bool;
}
 
LogicElement::LogicElement(const LogicElement &q){
    name = new char[ strlen(q.name) + 1 ];
    strcpy(name, q.name);
    inp_nmb = q.inp_nmb;
    inputs = new bool;
}
 
LogicElement::~LogicElement(){
    
    delete[] name;
    inp_nmb = 0;
    delete[] inputs;
}
 
bool LogicElement::Evaluate(){
    bool b;
    int i;
    b=0;
    
    if (name=="AND")
        for (i=0; i<inp_nmb; i++){
            b = b && (*inputs);
            inputs++;
        };
    if (name=="OR")
        for (i=0; i<inp_nmb; i++){
            b = b || (*inputs);
            inputs++;
        };
    if (name=="XOR")
        for (i=0; i<inp_nmb; i++){
            b = (b || (*inputs)) && !(b && (*inputs));
            inputs++;
        };
    if (name=="ANDNEG")
        for (i=0; i<inp_nmb; i++){
            b = !(b && (*inputs));
            inputs++;
        };
    if (name=="ORNEG")
        for (i=0; i<inp_nmb; i++){
            b = !(b || (*inputs));
            inputs++;
        };
    return b;
};
 
void LogicElement::SetInputs(const bool *Inputs){
    int i;
    for (i=0; i<inp_nmb; i++)
        if (i/2==0){
            *inputs=0;
            inputs++;
        }
        else {
            *inputs=1;
            inputs++;
        }
};
 
void LogicElement::PrintStatus(){
    printf("%s %d\n", *name,inp_nmb);
}
 
 
 
 
#include "header.h"
#include "stdio.h"
 
 
int main(){
    char *s;
    s="AND";
    LogicElement x(s,2);
    bool *inputs; 
    x.SetInputs(inputs);
    x.Evaluate();
    x.PrintStatus();
return 0;
};
На мой вгляд, у вас вообще безграмотно определен класс.
Я не вижу никакого смысла объявлять указатель на bool вместо самого члена класса типа bool. Какой глубокий смысл состоит в том, чтобы выделять указатель на bool? Во-первых, вы не инициализируете свою переменную inputs значением при создании объекта вашего класса. То есть в этом члене содержится некий мусор. Во-вторых, в своей функции

C++
1
void LogicElement::SetInputs(const bool *Inputs)
вы передаваемыфй параметр Inputs вообще не используете. Спрашиваете, а зачем он тогда присутствует в объявлении вашей функции?!
0
Bobster
Сообщений: n/a
31.08.2011, 22:54 #14
Все, всем спасибо. Со всем разобрался. Код реально глупый у меня был сначала) Просто начал изучение с++ два месяца назад. Язык вроде немного выучил, но вот навык программирования отсутствует.
31.08.2011, 22:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2011, 22:54
Привет! Вот еще темы с ответами:

Класс, производный класс, паблик-класс - C++
Задание: Создать класс колесо, которое имеет радиус. Определить конструкторы и метод доступа. Создать класс машин, содержащий класс колесо....

Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки машин ”: марка - C++
Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки...

Абстрактный класс CGraphicsObject, его наследник - базовый класс CPoint, и класс - наследник от CPoint - C++
Всем доброй ночи! Очень нужна помощь и по мере возможности разъяснения на темы: абстрактный класс в задании(что он из себя представляет и...

Ошибка в выводе данных, класс выводит правильно, а класс в классе - нет - C++
Неизвестная для меня проблема. Класс выводит данные правильно из Consigment, а вот третий экземпляр класса, работает не верно, если...


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

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

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