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

Метод работает как то не понятно - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сортировка цифр http://www.cyberforum.ru/cpp-beginners/thread1109408.html
Сколько сравнений понадобится в худшем случае, чтобы упорядочить по возрастанию 4 различных числа (поменять местами значения переменных a, b, c, d так, чтобы a<b<c<d) Хотя бы алгоритм скиньте, пожалуйста :)
C++ ошибочка происходит ошибка в стрчоке 33, в файле содержаться цифры, подскажите в чем проблема #include "stdafx.h" #include <iostream> #include <vector> #include <fstream> using namespace std; struct Graph { http://www.cyberforum.ru/cpp-beginners/thread1109406.html
C++ Вычислить значение выражения
#include<iostream.h> #include<conio.h> #include<math.h> //using namespace std; int main(void){ double x=1; double hx=0.5; double a=-0.5; double ha=0.2; double f;
C++ Сколько сравнений понадобится в худшем случае, чтобы упорядочить по возрастанию 4 различных числа
Сколько сравнений понадобится в худшем случае, чтобы упорядочить по возрастанию 4 различных числа (поменять местами значения переменных a, b, c, d так, чтобы a<b<c<d) Хотя бы алгоритм скиньте, пожалуйстаим :)
C++ Создать и вывести двухмерный массив для хранения показателей полуденной температуры за каждый день первого полугодия http://www.cyberforum.ru/cpp-beginners/thread1109376.html
Создать и вывести двухмерный массив для хранения показателей полуденной температуры за каждый день первого полугодия, сгруппирован помесячно (столбцы соответствуют дням, строки - номерам месяцев)
C++ Реализовать список для Guest и Resident Всем здравствуйте. Ребят, помогите, пожалуйста, дан небольшой код программы: #include "stdafx.h" #include <iostream> #include <string> #include <list> #include <cstdlib> class Person; class Resident; подробнее

Показать сообщение отдельно
DrOffset
6801 / 4012 / 922
Регистрация: 30.01.2014
Сообщений: 6,835
03.03.2014, 16:01     Метод работает как то не понятно
Ошибок на самом деле море.
Метод addition должен принимать константную ссылку (зачем лишнее копирование аргумента?), проверки, про которые я уже говорил - не нужны. Не знаю зачем ты их оставил, но они ровным счетом ничего не дают.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <typename TBase>
bool TArray <TBase>::Addition(TBase const &s)
{
    TBase  *Buffer;
    size_t  NewSize;
    size_t  NewCount;
    NewCount = Count + 1;
    if (NewCount > 0)
    {
        NewSize = NewCount * sizeof(TBase);
        Buffer  = (TBase*)realloc(Data, NewSize);
        if(Buffer!=NULL)
        {
            new (Buffer+Count) TBase(s);
            Count=NewCount;
            Data =Buffer;
            return true;
        }
    }
    return false;
}
В нормальных реализациях для operator[] нужно предусматривать и его константную версию:
C++
1
2
3
4
5
template <typename TBase>
TBase const & TArray <TBase>::operator[](size_t  Index ) const
{
    return *(Data+Index);
}
Конструктор копирования реализован неверно (вызывает присваивание вместо копирования у хранимых объектов!), кроме того он должен принимать константную ссылку. msize опять же нафиг не нужен, зачем, если есть Original.Сount? Предварительная инициализация полей нужна.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <typename TBase>
TArray <TBase>::TArray(TArray const & Original)
    : Count(0), Data(NULL)
{
    if(Original.Count > 0)
    {
        Data = (TBase*)malloc(Original.Count);
        if(Data != NULL)
        {
            Count = Original.Count;
            for(size_t i = 0; i < Count; ++i)
            {
                new(Data + i) TBase(Original[i]);
            }
        }
    }
}
В деструкторе затесалась неизвестная переменная Count, которая перекрыла Count из класса. Собственно поэтому и падало:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename TBase>
TArray <TBase>::~TArray()
{
    TBase  *p;
    if (Data!=NULL)
    {
        for(p=Data+Count-1; p>=Data; --p)
        {
            p->~TBase();
        }
        free(Data);
    }
}
функция OpenFile почему-то возвращает ссылку на временный объект! Этого делать ни в коем случае нельзя!
В остальном коде все примерно так же.
_msize выкинуть вообще, т.к. не нужен.
Для удаления предусмотреть функцию deallocate, чтобы не повторяться.
Проконтролировать где объект изменяется, а где нет, соответственно расставив правильно const.
 
Текущее время: 03:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru