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

Неправильно работает функция CArray.Add() - C++

Восстановить пароль Регистрация
 
FreestyleDM
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 16
07.04.2014, 23:34     Неправильно работает функция CArray.Add() #1
Вобщем вызываю CellAr.Add(DictCell("sda",823)) но в сам массив записывается объект созданный конструктором без параметров, хотя через отладку(F11 в VS13) показывает что использует конструктор копирования.
Подскажите, что не так.
Привожу часть кода неработающую. Все что относится к проблеме.
afxtempl.h подключены, не смог просто выложить полностью проект, форум не дает.
Вот часть заголовочного файла
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
class DictCell
{
public:
    DictCell(); // Конструктор без параметров
    DictCell(DictCell& iCell); // Конструктор копирования
    DictCell(string, unsigned int); // Конструктор с параметрами
    ~DictCell(); // Деструктор
    DictCell& operator=(const DictCell&);
    DictCell& operator=(DictCell* iCell)
    {
        return *iCell;
    };
    const void GetID(unsigned int&); // Получение ID ячейки
    unsigned int GetID();
    const void GetNWords(unsigned int&); // Получение количества слов в ячейке
    unsigned int GetNWords();
    const void GetContent(string&); // Получение содержания ячейки
    string GetContent();
    void Concat(const DictCell&); // Объединение ячеек
 
private:
    static unsigned int s_CellCount; // Счетчик количества ячеек
    unsigned int m_ID; // ID ячейки
    string m_sContent; // Содержание ячейки
    unsigned int m_nWords; // Количество слов в ячейке
    
 
};
unsigned int DictCell::s_CellCount = 0;
DictCell::DictCell() : m_ID(++s_CellCount), m_sContent("/0"), m_nWords(0)
{
}
DictCell::DictCell(string iContent, unsigned int iWords) : m_ID(++s_CellCount), m_sContent(iContent), m_nWords(iWords)
{
}
DictCell::DictCell(DictCell& iCell)
{
    m_ID = iCell.GetID();
    m_sContent = iCell.GetContent();
    m_nWords = iCell.GetNWords();
}
DictCell::~DictCell()
{
}
DictCell& DictCell::operator=(const DictCell& right)
{
    DictCell temp;
    temp.m_ID = right.m_ID;
    temp.m_sContent = right.m_sContent;
    temp.m_nWords = right.m_nWords;
    return temp;
}
const void DictCell::GetID(unsigned int& iID)
{
    iID=m_ID;
}
unsigned int DictCell::GetID()
{
    return m_ID;
}
const void DictCell::GetContent(string& iContent)
{
    iContent = m_sContent;
}
string DictCell::GetContent()
{
    return m_sContent;
}
const void DictCell::GetNWords(unsigned int& iWords)
{
    iWords = m_nWords;
}
unsigned int DictCell::GetNWords()
{
    return m_nWords;
    //return 157;
}
void DictCell::Concat(const DictCell& iCell)
{
    m_sContent += iCell.m_sContent;
    m_nWords += iCell.m_nWords;
    iCell.~DictCell();
}
Вот часть кода файла cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    DictCell C1("ads", 5432);
    DictCell C2(C1);
    CArray<DictCell, DictCell> CellAr;
    CellAr.Add(C2); //не работает
    CellAr.Add(C1); //не работает
    cout << CellAr.GetSize() //проверка просто
        << CellAr[0].GetID() 
        << CellAr[0].GetNWords()
        << endl;
    system("pause");
    return 0;
}
Где еще может косяки есть, подскажите пожалуйста.
А еще часто при компиляции пишет предупреждение что неоднозначная точка входа в программу и что использует по умолчанию точку.
Заранее спасибо

Добавлено через 45 минут
очень нужна помощь, народ, именно через CArray надо реализовать задание
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
07.04.2014, 23:40     Неправильно работает функция CArray.Add() #2
Цитата Сообщение от FreestyleDM Посмотреть сообщение
CArray<DictCell, DictCell> CellAr;
вот так попробуй
CArray<DictCell, &DictCell> CellAr;
давно CArray не работал точно не помню
FreestyleDM
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 16
07.04.2014, 23:52  [ТС]     Неправильно работает функция CArray.Add() #3
я пробовал и c &, компилится, но все равно пихает данные из конструктора по умолчанию
и через * а отправлял адреса объектов в функцию, опять же копилируется но не работает
Вообще не знаю что делать, а какая альтернатива есть CArray? Vector?

Добавлено через 5 минут
Тестовый вариант массива из стандартного класса CPoint работает всё ок.
Значит что то не так у меня с конструкторами, как я понимаю. Подскажите что не так в описании класса DictCell
C++
1
2
3
4
5
CArray<CPoint, CPoint>TestArray;
    CPoint cp(35, 64);
    TestArray.Add(cp);
    cout << TestArray[0].x << TestArray[0].y << endl;
    system("pause");
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
07.04.2014, 23:59     Неправильно работает функция CArray.Add() #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от FreestyleDM Посмотреть сообщение
Значит что то не так у меня с конструкторами, как я понимаю. Подскажите что не так в описании класса DictCell
C++
1
DictCell& operator=(const DictCell&);
это конструктор присваивания?

если да то делать надо как-то так
:
C++
1
2
3
4
5
6
7
8
   Test& operator=(const Test & t)
   {
      if (this == &t)
         return *this;
      val = t.val;
 
      return *this;
   }
FreestyleDM
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 16
08.04.2014, 00:48  [ТС]     Неправильно работает функция CArray.Add() #5
Заработало! Спасибо большое. Из за одного конструктора вот такая фигня была..
А в остальном не могли бы посмотреть, правильно ли описаны классы? Или какие то рекомендации(по названиям или как реализовывать лучше то или иное)? А то я тока учусь
Заголовочный файл:
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#pragma once
 
#include "resource.h"
 
using namespace std;
/////////////////////////////////////////////
class DictCell
{
public:
    DictCell(); // Конструктор без параметров
    DictCell(DictCell& iCell); // Конструктор копирования
    DictCell(string, unsigned int); // Конструктор с параметрами
    ~DictCell(); // Деструктор
    DictCell& operator=(const DictCell& iCell)
    {
        //if (this == iCell) //Пока не перегрузил оператор ==
        //{
        //  return *this;
        //}
        m_ID = iCell.m_ID;
        m_nWords = iCell.m_nWords;
        m_sContent = iCell.m_sContent;
        return *this;
    }
    const void GetID(unsigned int&); // Получение ID ячейки
    unsigned int GetID();
    const void GetNWords(unsigned int&); // Получение количества слов в ячейке
    unsigned int GetNWords();
    const void GetContent(string&); // Получение содержания ячейки
    string GetContent();
    void Concat(const DictCell&); // Объединение ячеек
 
private:
    static unsigned int s_CellCount; // Счетчик количества ячеек
    unsigned int m_ID; // ID ячейки
    string m_sContent; // Содержание ячейки
    unsigned int m_nWords; // Количество слов в ячейке
    
 
};
unsigned int DictCell::s_CellCount = 0;
DictCell::DictCell() : m_ID(++s_CellCount), m_sContent("\0"), m_nWords(0)
{
}
DictCell::DictCell(string iContent, unsigned int iWords) : m_ID(++s_CellCount), m_sContent(iContent), m_nWords(iWords)
{
}
DictCell::DictCell(DictCell& iCell)
{
    m_ID = iCell.GetID();
    m_sContent = iCell.GetContent();
    m_nWords = iCell.GetNWords();
}
DictCell::~DictCell()
{
}
const void DictCell::GetID(unsigned int& iID)
{
    iID=m_ID;
}
unsigned int DictCell::GetID()
{
    return m_ID;
}
const void DictCell::GetContent(string& iContent)
{
    iContent = m_sContent;
}
string DictCell::GetContent()
{
    return m_sContent;
}
const void DictCell::GetNWords(unsigned int& iWords)
{
    iWords = m_nWords;
}
unsigned int DictCell::GetNWords()
{
    return m_nWords;
    //return 157;
}
void DictCell::Concat(const DictCell& iCell)
{
    m_sContent += iCell.m_sContent;
    m_nWords += iCell.m_nWords;
    iCell.~DictCell();
}
///////////////////////////////////////////
class Dictionary
{
public:
    Dictionary(); // Конструктор без параметров
    Dictionary(string, string); // Конструктор без параметров
    ~Dictionary(); // Деструктор
    void Concat(const Dictionary&); // Объединение словарей
    void PutData(string, string);
    void CellAdd(DictCell& iCell);
    void CellRemove(unsigned int);
    void PrintData();
 
private:
    string m_sName; // Название словаря
    string m_sType; // Тип словаря
    unsigned int m_nWords; // Количество слов в словаре
    unsigned int m_nCells; // Количество ячеек в словаре
    CArray <DictCell, DictCell> aCell; // Массив ячеек
};
 
Dictionary::Dictionary() : m_sName("\0"), m_sType("\0"), m_nWords(0), m_nCells(0)
{
}
Dictionary::Dictionary(string iName, string iType) : m_sName(iName), m_sType(iType), m_nWords(0), m_nCells(0)
{
}
Dictionary::~Dictionary()
{
}
void Dictionary::PutData(string iName, string iType)
{
    m_sName = iName;
    m_sType = iType;
}
void Dictionary::CellRemove(unsigned int i)
{
    m_nWords -= aCell[i].GetNWords();
    m_nCells--;
    aCell.RemoveAt(i);
}
void Dictionary::CellAdd(DictCell& iCell)
{
    m_nWords += iCell.GetNWords();
    m_nCells++;
    aCell.Add(iCell);
}
void Dictionary::Concat(const Dictionary& iDict)
{
    m_nWords += iDict.m_nWords;
    m_nCells += iDict.m_nCells;
    aCell.Append(iDict.aCell);
}
void Dictionary::PrintData()
{
    cout << "Name= " << setw(15) << m_sName 
        << ", Type= " << setw(10) << m_sType 
        << ", nWords= " << setw(5) << m_nWords 
        << ", nCells= " << setw(5) << m_nCells
        << endl;
}
Добавлено через 16 минут
Больше всего мне интересно где правильнее (где принято) определять методы, операторы, конструкторы. Внутри класса или вне?
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
08.04.2014, 11:33     Неправильно работает функция CArray.Add() #6
FreestyleDM, вообще методы с больше чем одной строкой кода лучше определять вне класса, но это только удобства ради;
методы определенные внутри становятся инлайновыми, если инлайновый метод определяется вне определения класса - он должен быть в заголовочном файле (чтобы избежать конфликта имен), в остальных случаях все методы должны быть определены в .cpp;
шаблонный класс должен быть полностью определен в .hpp

по поводу оператора присваиванивания -
Цитата Сообщение от FreestyleDM Посмотреть сообщение
//if (this == iCell) //Пока не перегрузил оператор ==
* * * * //{
* * * * //* return *this;
* * * * //}
здесь идет проверка указателей - не нужно перегружать оператор сравнения для этого,
там просто сравниваются два шестнадцатеричных числа this == &iCell
this - указатель, iCell - объект, &iCell - адресс объекта iCell (указатель), & - оператор взятия адреса (не путать использование этого оператора в аргументах и возвращаемых значений функций)
FreestyleDM
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 16
08.04.2014, 20:07  [ТС]     Неправильно работает функция CArray.Add() #7
rcyn, то есть мне все методы вынести в отдельный cpp? а в заголовочном файле оставить только описание класса?
rcyn
13 / 9 / 2
Регистрация: 30.01.2014
Сообщений: 47
08.04.2014, 22:16     Неправильно работает функция CArray.Add() #8
Всё зависит от ситуации, если вам удобно держать объявление и определение класса в файле c main - то зачем что-то менять?
Навести красоту для того чтобы показывать код кому-то можно потом.

А так-то да.
Общий случай: в заголовочном объявление, в цппшнике определение.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2014, 22:47     Неправильно работает функция CArray.Add()
Еще ссылки по теме:

Неправильно работает функция string::find_last_of C++
Почему функция atanh работает неправильно? C++
Неправильно работает функция strcmp c русскими буквами C++

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

Или воспользуйтесь поиском по форуму:
FreestyleDM
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 16
08.04.2014, 22:47  [ТС]     Неправильно работает функция CArray.Add() #9
Да, это ДЗ в универе, нужно создать систему классов словарей и гнезд словарей. Потом нужно делать документацию полностью на эту систему классов. И показывать преподу. красота кода важна тоже.
А кто может подсказать, как лучше слова в ячейки(гнезда) запихнуть? Тем же CArray? и вообще правильно ли я понял, что такое ячейка словаря(как я понял напр. ячейка "АБ" содержит все слова, начинающиеся на АБ... если таких слов много..ну скажем 5000+ то делим до третьей буквы и т.д.)
Yandex
Объявления
08.04.2014, 22:47     Неправильно работает функция CArray.Add()
Ответ Создать тему
Опции темы

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