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

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

Восстановить пароль Регистрация
 
Bobster
Сообщений: n/a
31.08.2011, 12:27     сконструировать класс #1
Добрый день. Мне надо сконструировать следующий класс:

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++ Класс домов и класс улиц для учета поступлений квартплаты. Массив
C++ Нужно сконструировать алгоритм задачи
Класс, производный класс, паблик-класс C++
C++ Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки машин ”: марка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.08.2011, 12:33     сконструировать класс #2
Bobster, Выделить память?

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

Вы в конструкторе выделяете под один bool память. А удаляете/используете как массив.
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;
};
-=ЮрА=-
Заблокирован
Автор 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);
}
Миниатюры
сконструировать класс  
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.08.2011, 14:02     сконструировать класс #5
-=ЮрА=-, Вот про освобождение - не стоит плохому людей учить. Деструкторы существуют в том числе для того, чтобы память очищалась.
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2011, 14:26     сконструировать класс #6
Цитата Сообщение от ForEveR Посмотреть сообщение
Вот про освобождение - не стоит плохому людей учить
- я писал за конкретный случай - человек в strcpy присваивает строковой переменной класса, адрес константной строковой переменной, в данном случае при чистке вылезет баг . Касательно освобождения памяти в общем случае - если память используется 1-разово то при завершении программы операционка сама её очистит, это так же как снимать хук-точку не обязательно, т.к. при закрытии система кое-что и сама делает...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.08.2011, 14:35     сконструировать класс #7
- я писал за конкретный случай - человек в strcpy присваивает строковой переменной класса, адрес константной строковой переменной, в данном случае при чистке вылезет баг
Человек предварительно выделяет память для переменной класса. Какой нафиг баг?
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2011, 14:43     сконструировать класс #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Человек предварительно выделяет память для переменной класса. Какой нафиг баг?
- теперь всмотрелся что баг не на строке а на inputs вылетает, вот он
Миниатюры
сконструировать класс  
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
31.08.2011, 15:04     сконструировать класс #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Выделить память?
Так он этот переданный указатель и не использует )

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

Добавлено через 3 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- теперь всмотрелся что баг не на строке а на inputs вылетает, вот он
Ну так память-то выделяется при помощи new, а не new[], следовательно и освобождать её надо соответственно.
-=ЮрА=-
Заблокирован
Автор 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
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
31.08.2011, 15:28     сконструировать класс #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а вот для такого варианта выделения всё же нужна
Такой вариант выделения памяти вообще не корректный, так как нет места на '\0'.

Добавлено через 1 минуту
Да и все равно, проверка не нужна.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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"))
Сыроежка
Заблокирован
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 вообще не используете. Спрашиваете, а зачем он тогда присутствует в объявлении вашей функции?!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2011, 22:54     сконструировать класс
Еще ссылки по теме:

Реализовать класс Goods используя для представления цены класс Money C++
C++ Ошибка в выводе данных, класс выводит правильно, а класс в классе - нет
Отдельно класс данных, класс формул и главный класс C++

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

Или воспользуйтесь поиском по форуму:
Bobster
Сообщений: n/a
31.08.2011, 22:54     сконструировать класс #14
Все, всем спасибо. Со всем разобрался. Код реально глупый у меня был сначала) Просто начал изучение с++ два месяца назад. Язык вроде немного выучил, но вот навык программирования отсутствует.
Yandex
Объявления
31.08.2011, 22:54     сконструировать класс
Ответ Создать тему
Опции темы

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