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

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

Войти
Регистрация
Восстановить пароль
 
 
trev
0 / 0 / 0
Регистрация: 10.07.2014
Сообщений: 13
#1

Какие ошибки допущены при проектировании класса - C++

27.07.2014, 12:36. Просмотров 895. Ответов 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
44
45
46
47
48
49
50
51
52
53
#include "stdafx.h"
#include <fstream>
 
class FileClient
{
protected:
    char* p;
public:
 
    virtual void connect() = 0;
    void close(){}
    virtual void ping()
    {
        printf("%s : %s", "__FUNCTION__", p);
    }
    FileClient()
    {
        p = new char[10];
        p[0] = '1';
    }
    ~FileClient()
    {
        delete p;
    }
};
class Client : public FileClient
{
    FILE* hFile;
public:
    virtual void connect()
    {
        hFile = fopen("d:\test.txt", "w");
    }
    void ping()
    {
        char arr[] = { 0, 0, 5, 56, 12, 32 };
        fwrite(arr, 1, sizeof(arr), hFile);
        FileClient::ping();
    }
    ~Client()
    {
        delete[] p;
        p = 0;
    }
};
 
int main()
{
    FileClient* client = new Client;
    client->connect();
    client->ping();
    delete client;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2014, 12:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Какие ошибки допущены при проектировании класса (C++):

Использование конструкторов и деструктора при проектировании пользовательского класса - C++
Дан одномерный массив A. Найти max (a2, a4, …, a2k) + min (a1, a3, …, a2k+1).

Ошибки при наследовании класса - C++
Доброго времени суток!Возникли ошибки при компиляции кода Задание было такое:Создать абстрактный базовый класс Body (тело) с виртуальными...

Ошибки при наследовании класса от вектора - C++
Пишу программу по СМО, столкнулся с трудностью при попытке сделать наследование очередью Cqueue вектора из STL. Проблема состоит в том,...

Ошибки линковки при использовании шаблонного класса - C++
Есть заголовочной файл Utils.h, в котором определены 2 класса String и ArrayList&lt;T&gt;: class String : public Comparable&lt;String&gt; { ...

Ошибки при создании vector'a пользовательского класса - C++
Шалом, мои весьма дорогие друзья, столкнулся с проблемой. Решил использовать вместо массивов пресловутый вектор, и вроде бы все шло хорошо,...

Remove_if - при передаче функции класса выдает ошибки - C++
#include &lt;QCoreApplication&gt; #include &lt;vector&gt; using namespace std; template &lt;class T&gt; class c_equ { protected: T equ; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
27.07.2014, 15:27 #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
битый поинтер
Действительно. Неужели правда нужно это объяснять?
Цитата Сообщение от gray_fox Посмотреть сообщение
И как тут поможет if (ptr) ?
0
-=ЮрА=-
Заблокирован
Автор FAQ
27.07.2014, 15:54 #17
DrOffset, по моему ты сейчас кивнул в мою сторону.
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
#include <iostream>
using namespace std;
 
class cObj{
    static int param;
public:
    cObj(){
        param++;
    }
    ~cObj(){
        param--;
    }
    static int GetParam(){
        return param;
    }
    static void Reset(){
        param = 0;
    }
};
 
int cObj::param = 0;
 
void operator delete(void *p)
{
    int param = cObj::GetParam();
    if( param )
        throw param;
}
 
int main(){
    cObj * ptr = new cObj[5];
    ptr = 0;
    if( ptr )
        delete [] ptr;
    else
        cObj::Reset();
    return 0;
}
Фильтровать поинтер нужно всегда, конечно если тут люд кроме консоли нечего не видиывал то понятно, или никогда не перегружал ряд операторов, чтобы отладить какой нибудь нетривиальный проект.
Первый макрос MFC
C++
1
2
3
4
5
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
И как тут поможет if (ptr) ?
- представь если у тебя несколько дочерних управляемых процессов, которые застрянут если просто так закроешь родительский.

0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
27.07.2014, 15:58 #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- представь если у тебя несколько дочерних управляемых процессов, которые застрянуть если просто так закроешь родительский.
Иии... как это связано с оператором delete?
0
-=ЮрА=-
27.07.2014, 16:00
  #19

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
Иии... как это связано с оператором delete?
- раскрой глаза

0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
27.07.2014, 16:01 #20
Цитата Сообщение от DrOffset Посмотреть сообщение
И как тут поможет if (ptr) ?
Подозреваю, что это что-то из разряда:
Цитата Сообщение от -=ЮрА=-
Некоторые вещи я предпочитаю знать лишь один
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
27.07.2014, 16:11 #21

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- раскрой глаза
Что ж, видимо я не настолько advanced что бы постичь это...



Добавлено через 3 минуты
Тогда может кто-нибудь другой мне это объяснит? У кого-нибудь глаза раскрыты?
0
-=ЮрА=-
Заблокирован
Автор FAQ
27.07.2014, 16:12 #22

Не по теме:

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



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
Что ж, видимо я не настолько advanced что бы постичь это..
- а ты сам какого уровня чтобы тебе надо всё разжёвывать? У тебя выше перегруженный делит стоит, тебе мешает твой низкий скил или желание попытаться меня потролить?Напиали - если не сделать ресет по нудевому поинтеру можно подвесить несколько процессов к примеру. Хотя я хз, по твоим ответам можно понять что управлять потоками врядли умеешь. Ладно не буду метать бисер...

0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
27.07.2014, 16:18 #23
Где линк-то? Не вижу
0
-=ЮрА=-
Заблокирован
Автор FAQ
27.07.2014, 16:19 #24
Цитата Сообщение от Voivoid Посмотреть сообщение
Где линк-то? Не вижу
держи Цветные строки в CComboBox
Поглядим стоит ли с тобой вообще разговаривать
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
27.07.2014, 16:22 #25
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
по моему ты сейчас кивнул в мою сторону.
Это ты зря так думаешь.

Собственно не понятно как твой код демонстрирует мою неправоту. Одно дело, когда логика программы каким-либо образом завязана на нулевой указатель, другое дело, когда нет. Да и ты не ответил, как именно такая проверка поможет найти битый пойнтер. Мы и с проверкой и без - все равно войдем в этот if, так как любой ненулевой указатель приводится к true. А последний твой код совсем о другом, как бы, ведь там есть else, который уже подразумевает какое-то кастомное действие, но речь шла не о том первоначально.

Очень много я встречал довольно таки опытных программеров, которые имели такую привычку, проверять на ноль перед delete, и никто так и не смог внятно объяснить зачем они это делают. Самый достойный вариант был о том, что в 89 году был компилятор, который такое не допускал, а вот привычка с тех пор осталась.

Собственно, 5.3.5/2.
In the first alternative (delete object), the value of the operand of delete may be a null pointer
value
, a pointer to a non-array object created by a previous new-expression, or a pointer to a subobject (1.8)
representing a base class of such an object (Clause 10). If not, the behavior is undefined. In the second
alternative (delete array), the value of the operand of delete may be a null pointer value or a pointer
value that resulted from a previous array new-expression.
0
-=ЮрА=-
Заблокирован
Автор FAQ
27.07.2014, 16:28 #26
DrOffset, хорошо для тебя, я всегда проверяю поинтер и предусматриваю возможные варианты, более того рекомендую писать ветки if( pointer ){}ele{}. в большинстве проектов приходится перегружать и new и delete как для отладки так и для прочих нужд. Лучше всегда иметь вариант на случай нулевого поинтера и удалять лишь живое причём небитое. Я показл выше код пост 17(если вдруг забыл). Представь если ресет из моего кода не зануляет параметр а кидает ивенту аля ABNORMAL_TERMINATE, и потом представь что если бы этой ивенты не было, а чтобы облегчить абстракцию представь что cObj некие сущности процессов.

Не по теме:

Или ты просто потролить захотел, тогда тебе с Voivoid на излечение Цветные строки в CComboBox. Далее буду разговаривать лишь с теми кто хоть внятно ответить сможет что там подправить надо(мой ехе уже в теме)

0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
27.07.2014, 16:30 #27
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Поглядим стоит ли с тобой вообще разговаривать

Не по теме:

Забавная логика. Как-бы невзначай перевести стрелки со знания C++ на MFC. Как будто мне все это нужно

0
Tulosba
27.07.2014, 16:31
  #28

Не по теме:

0
-=ЮрА=-
27.07.2014, 16:33
  #29

Не по теме:

Цитата Сообщение от Voivoid Посмотреть сообщение
Забавная логика. Как-бы невзначай перевести стрелки со знания C++ на MFC. Как будто мне все это нужно
- просто напиши я не могу этого сделать, с тобой понятно уже всё до конца.

0
Taatshi
27.07.2014, 18:52     Какие ошибки допущены при проектировании класса
  #30
 Комментарий администратора 
Господа, оффтоп прекращаем.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2014, 18:52
Привет! Вот еще темы с ответами:

Какие тут ошибки - C++
#include&lt;iostream.h&gt; #include&lt;math.h&gt; #include&lt;iomanip.h&gt; void main() { int **mas,n,k,i,j,a=0,o,p; cout&lt;&lt;&quot;vvedite razmer...

Какие здесь ошибки - C++
1) int main() { Node *p1, *p2; p1 = new Node; p2 = new Node; p1-&gt;Data = 11; p2-&gt;Data = 22; p1-&gt;Next = p2; p2-&gt;Next = NULL; cout &lt;&lt;...

Какие ошибки в коде? - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() { double a, b , c , D, x, y; cout &lt;&lt; &quot;Vvedite a b...

Какие ошибки в коде? - C++
В конце получаю b=-1#IND00 #include&lt;stdio.h&gt; #include&lt;math.h&gt; void main() { float x,y; printf(&quot;Enter x&quot;); scanf(&quot;%f&quot;, &amp;x);...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.07.2014, 18:52
Ответ Создать тему
Опции темы

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