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

Конструктор классов, Visual Studio 2008 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Алина_258
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 11
14.06.2011, 15:20     Конструктор классов, Visual Studio 2008 #1
Добрый день))

Помогите разобраться с ошибками.

В участке кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Перегрузка конструктора копирование  по умолчанию
Text (char ttext)
{
    //delete str[];
    //в прееменнуб длины записывает длину слова
    size = strlen(ttext.str);
    //заводим символьную переменную с вычисленны м размером
    str = new char[size+1];
    //заводим числовой массив частоты слов
    k= new int[size+1];
    //копируем в str строку
    strcpy(str,ttext.str);
    //возвращаемуказатель *this
    return *this;
}
Компилятор выдаёт ошибки:
Ошибка 5 error C2062: тип "char" не требуется k:\учёба\разработка и стандартизация\la3\la3\la3.cpp 48 la3
Ошибка 6 error C2143: синтаксическая ошибка: отсутствие ";" перед "{" k:\учёба\разработка и стандартизация\la3\la3\la3.cpp 49 la3
Ошибка 7 error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа) k:\учёба\разработка и стандартизация\la3\la3\la3.cpp 49 la3


Сам программный код:

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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
//подключаемые файлы
#include <ctype>
#include <fstream>
//
#include <windows>
#include <iomanip>
#include "stdafx.h"
#include <string.h>
#include <locale>
#include <stdio.h>
#include <iostream>
//подключение поля namespase
using namespace std;
 
//класс текст
class Text
{
    //скрытые элементы класса
private:
    //указатель на слово
    char* str;
    //разсер
    int size;
    //количество овторений
    int* k;
     //буфер
 
public:  
    //Функция возврата массива символов 
    const char* Show(void);
 
    //Функция сортировки слов (по возрастанию)
    void SortWord(void);
 
    //Перегрузка конструктора копирование  по умолчанию
    Text (char ttext);
    //Конструктор по умолчанию
    Text();    
    //Деструктор класса
    ~Text();
};
 
//Перегрузка конструктора копирование  по умолчанию
Text (char ttext)
{
    //delete str[];
    //в прееменнуб длины записывает длину слова
    size = strlen(ttext.str);
    //заводим символьную переменную с вычисленны м размером
    str = new char[size+1];
    //заводим числовой массив частоты слов
    k= new int[size+1];
    //копируем в str строку
    strcpy(str,ttext.str);
    //возвращаемуказатель *this
    return *this;
}
 
//Функция возврата массива символов 
const char* Text::Show(void)  // константный символьный указатель на функцию класса возвращает значение str
{
    int Word = 0; //Счетчик слов
    char** ArrWord = new char*[size+1]; //Массив слов
    char *buffer = new char[size+1]; //Буферная переменная
    char *ptr = buffer; //Указатель на буферную переменную
    memset(buffer,0,size+1); //Обнулим буфрную переменную
    char *pl;
    char c = ' ';
 
     for (int i=0; i <= strlen(str); i++) //Обойдем по-символьно всю строку
    
 
        *pl = *strrchr(str, c);
 
        int i = 0;
 
        if (!pl) //Если не пробел
        {
            char *ptr;
            *ptr++ = str[i]; //Пишим в буферную переменную и сдвигаем указатель
            i++;
 
        }
        else 
            if (strlen(buffer)>0) //Если же управляющий или разделитель и длина буферной переменной >0
        {
            ArrWord[Word] = new char[size+1]; //Выделим память под слово
            strcpy(ArrWord[Word++],buffer); //Скопируем буферную переменную в слово
            memset(buffer,0,size+1); //Обнулим память буферной переменной
            ptr = buffer; //Поставим указатель на начало буферной переменной
        }
            else {}
 
 
    char buf='0';
    const char *buff = &buf;
    strcpy(str,ArrWord[0]);
    strcpy(str, buff);
    strcpy(str, ArrWord[Word]);
 
//const int Word;
    //const int kо=k[0];
    //const int kw=k[Word];
 
    //struct stroka
    //{char str;
    //int ko;
    //int   kw;};
 
    return  str;
    k[0];
    k[Word];
}
 
//Функция сортировки слов (по возрастанию)
void Text::SortWord(void)
{        
 
    int Word = 0; //Счетчик слов
    char** ArrWord = new char*[size+1]; //Массив слов
    char *buffer = new char[size+1]; //Буферная переменная
    char *ptr = buffer; //Указатель на буферную переменную
    memset(buffer,0,size+1); //Обнулим буфрную переменную
    char *pl;
    char c = ' ';
 
    for (int i=0; i <= strlen(str); i++) //Обойдем по-символьно всю строку
    {
 
 
        *pl = *strrchr(str, c);
 
        if (!pl) //Если не пробел
        {
            char *ptr;
            *ptr++ = str[i]; //Пишим в буферную переменную и сдвигаем указатель
            k[i]=1;
        }
        else 
            if (strlen(buffer)>0) //Если же управляющий или разделитель и длина буферной переменной >0
        {
            ArrWord[Word] = new char[size+1]; //Выделим память под слово
            strcpy(ArrWord[Word++],buffer); //Скопируем буферную переменную в слово
            memset(buffer,0,size+1); //Обнулим память буферной переменной
            ptr = buffer; //Поставим указатель на начало буферной переменной
        }
            else {}
 
    }
    for (int i=0; i<Word-1; i++) /*в цикле обходим все лова*/
    {for (int j=1; j<Word; j++)
 
        {if (ArrWord[i]==ArrWord[j]) /*если слова под обоими объектами одинаковы */
    {k[i] = k[i] + 1;}/* количество повторений увеличиваем на 1*/
}}
 
    //const char *bufer= &buffer;
 
    //int k[size] = {1};
 
    //int str_len = strlen(buffer);
 
    //int i;
   // for(i = 0; i < str_len; i++)
   // {
   //     k[(unsigned char)str[i]]++;
   // }
 
 
    memset(str,0,size+1); //Обнулим строку
    //Сортируем слова по длине
 
    //char Arrword[100];
 
    for (int i = 0; i<Word-1; i++)//Обойдем весь массив слов
    {
        int mkol=k[i];//mkol присваивается значение k текущее
        char * Max =  ArrWord[i];// символьной переменной Max присваивается указатель на пермененную с индексом i массива Arrword
        int pos = i; // значению целочисленной переменной pos присваивается значение i
 
        for (int j=i; j<Word; j++) //Обойдем все слова с i 
        {
            if (mkol < k[pos])
            {
               Max =  ArrWord[j];
                mkol = k[j];
                pos = j;
            }
 
 
if (ArrWord[i]==Max)
{}
else
{strcpy(buffer, ArrWord[i]);
strcpy (ArrWord[i],ArrWord[j]);
strcpy (ArrWord[j], buffer);
}
 
                Max =  ArrWord[i];
                mkol = k[i];
                pos = i;
strcat(str,ArrWord[i]);
                }
        if ( (i+1) != Word) strcat(str," ");
    }
    for (int i = 0; i<Word; i++)
    {
        delete[] ArrWord[i];
    }
    delete [] buffer;
    delete [] ArrWord;
}
 
//Деструктор класса
Text::~Text()
{
    delete[] str;
}
 
 
// главный код программы
int _tmain(int argc, _TCHAR* argv[])
{
    //поключение русского языка
    setlocale(LC_ALL, "Russian");
    
    //Тестирование класса Text
    //инициализируем k
 
char ttext;
cout<<"введите текст"<< endl;
cin>> ttext;
//char * Value= &ttext;
    Text K(ttext);
    //выполняе выполнение функции для K объекта с текстом 
    K.SortWord();
    //печатаем результат
    std::cout<<K.Show()<<std::endl;
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2011, 15:20     Конструктор классов, Visual Studio 2008
Посмотрите здесь:

C++ Работает в Borland Developer Studio 2006 но не работает в Visual Studio 2008, почему?
несовместимость visual c++ 6.0 и visual studio 2008 C++
несовместимость visual c++ 6.0 и visual studio 2008 C++
Microsoft Visual studio 2008 C++
C++ Visual studio 2008 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.06.2011, 15:34     Конструктор классов, Visual Studio 2008 #2
Алина_258, во-первых, это никакой не конструктор копирования. Сигнатура конструктора копирования должна быть такой:
C++
1
MyClass(const MyClass &);
Во-вторых, у вас параметр ttext имеет тип char, т.е. это просто один символ. Но вы пытаетесь обратиться к какому-то члену str символа ttexst.
В-третьих, конструктор не возвращает значений. вы же пытаетесь вернуть *this.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
14.06.2011, 15:53     Конструктор классов, Visual Studio 2008 #3
пользуйся string, зачем комбинировать с и с++
Алина_258
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 11
14.06.2011, 15:54  [ТС]     Конструктор классов, Visual Studio 2008 #4
Объявлю строку string вместо char.
Про конструктор ясно.
Спасибо))
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
14.06.2011, 15:54     Конструктор классов, Visual Studio 2008 #5
это вредно для здоровья
Алина_258
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 11
14.06.2011, 16:10  [ТС]     Конструктор классов, Visual Studio 2008 #6
отчего? конструктор же может содержать в параметре любой тип.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
14.06.2011, 16:34     Конструктор классов, Visual Studio 2008 #7
ну это так на будущее, когда начнёшь работать с исключениями поймёшь это. Деструкторы для автоматических объектов вызываются по мере раскрутки стека, а для char* ниченго не вызывается, вся ответсвенность за удаление лежит на пользователе в случае чего. Строки в стиле си практически не нужны в с++, тольтко для каких-нибудь низкоуровневых представлений

Добавлено через 8 минут
указатели прочих типов можно в auto_ptr загнать, чтобы гарантировать их уничтожении в не зависимости от того как завершилась функция
Алина_258
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 11
14.06.2011, 16:49  [ТС]     Конструктор классов, Visual Studio 2008 #8
прописала массив *char text в параметре конструктора,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Text (char * ttext)
{
 
    //delete str[];
    char ch = '0';
    //в прееменнуб длины записывает длину слова
    size = strlen(* ttext);
    for (int i = 0 ; i < size ; i++)
    {
    //заводим числовой массив частоты слов
    char * probel = char *strrchr(ttext, str);
    char *strncpy (char *ttext, char *str, char *probel);
    //заводим символьную переменную с вычисленны м размером
    k= new int[size+1];}
    //копируем в str строку
   // strcpy(str,ttext.str);
 
}
Ошибки остались прежними
Ошибка 5 error C2062: тип "char" не требуется k:\учёба\разработка и стандартизация\la3\la3\la3.cpp 48 la3
Ошибка 6 error C2143: синтаксическая ошибка: отсутствие ";" перед "{" k:\учёба\разработка и стандартизация\la3\la3\la3.cpp 49 la3
Ошибка 7 error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа) k:\учёба\разработка и стандартизация\la3\la3\la3.cpp 49 la3
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2011, 17:01     Конструктор классов, Visual Studio 2008
Еще ссылки по теме:

Visual Studio 2008 C++
Конструктор в Visual Studio 2013 C++
C++ MS Visual Studio 2008 всплывающие подсказки над переменными классов

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

Или воспользуйтесь поиском по форуму:
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
14.06.2011, 17:01     Конструктор классов, Visual Studio 2008 #9
Цитата Сообщение от Алина_258 Посмотреть сообщение
size = strlen(* ttext);
size = strlen(ttext);
Цитата Сообщение от Алина_258 Посмотреть сообщение
char * probel = char *strrchr(ttext, str);
char * probel = strrchr(ttext, str);
Цитата Сообщение от Алина_258 Посмотреть сообщение
strncpy (ttext, str, probel);
probel тут как бы вобще не вписывается, если мне память не изменяет третий параметр там инт или size_t

Добавлено через 4 минуты
советую почитать сначала про указатели и asciiz строки, иначе последующее изучение языка будет крайне не продуктивным. А потом уже пытаться тыркаться с классами. Так с верхушки не получиться изучить язык. Пробелы рано или поздно дадут о себе знать, собственно они уже щас тянут тебя вниз
Yandex
Объявления
14.06.2011, 17:01     Конструктор классов, Visual Studio 2008
Ответ Создать тему
Опции темы

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