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

Строки+ООП=жесть? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
FLeX
0 / 0 / 0
Регистрация: 18.10.2008
Сообщений: 5
18.10.2008, 01:19     Строки+ООП=жесть? #1
Я, наверное, зря начал освоение ООПа с C++, да еще и с работ со строками, но тем не менее уже дело чести, по-моему, добить данную программу. Листинг программы и ошибок выдаю ниже. Помогите, кто чем может
Программа:
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
#include "iostream"
#include "conio.h"
#include "stdio.h"
#include "string"
using namespace std;
 
class db
{
public:
    static string read_string(int string_number)
    {   
        FILE *file_input;
        if ((file_input = fopen("d:\\fi.txt", "r"))==0)
            {
        cout<<"Open entrance file error";
        getch();
        return 0;
            }
        string str1;
        const int length=36;
        fseek(file_input, (length+1)*string_number, SEEK_SET);
        fread(&str1, length-1, 1, file_input);
        fclose(file_input);
        return str1;    
    }
};
class monitor
{
private:
    string type;
    int retail, wholesale;
    string comments;
public:
    monitor(int id=1)
    {
        string str2;
        str2=db::read_string(id);
        type&=assign(string& str2, 0, 8);
        wholesale=atoi(&str2[9]);
        retail=atoi(&str2[14]);
        comments&=assign(string& str2,19,16);
        return 0;
    }
};
 
int main()
{   
    int number_string;
    cout<<"Enter string number";
    cin>>number_string;
    monitor output(number_string);
    cout<<"Type of monitor: "<<output.type<<"\nWholesale: "<<output.wholesale<<"\nRetail: "<<output.retail<<"\nComments: "<<output.comments;
    getch();
    return 0;
}
Ошибки:

------ Build started: Project: projects, Configuration: Release Win32 ------
Compiling...
projects.cpp
.\projects.cpp(13) : warning C4996: 'fopen' was declared deprecated
C:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(234) : see declaration of 'fopen'
Message: 'This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
.\projects.cpp(16) : warning C4996: 'getch' was declared deprecated
C:\Program Files\Microsoft Visual Studio 8\VC\include\conio.h(145) : see declaration of 'getch'
Message: 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.'
.\projects.cpp(38) : error C2275: 'std::string' : illegal use of this type as an expression
C:\Program Files\Microsoft Visual Studio 8\VC\include\xstring(2090) : see declaration of 'std::string'
.\projects.cpp(38) : error C3861: 'assign': identifier not found
.\projects.cpp(41) : error C2275: 'std::string' : illegal use of this type as an expression
C:\Program Files\Microsoft Visual Studio 8\VC\include\xstring(2090) : see declaration of 'std::string'
.\projects.cpp(41) : error C3861: 'assign': identifier not found
.\projects.cpp(42) : error C2534: 'monitor' : constructor cannot return a value


Программа должна прочитать файл fi.txt (в котором определенным образом упорядочена информация о нескольких мониторах построчно), в классе db описывается процесс чтения необходимой строки, в классе monitor всё это дело из строки разбивается по отдельным переменным для более удобного доступа. В данном случае main() и ее ошибки даже не имеют значения - проблема в классах/строках. Только вот где - понять трудно.
Заранее спасибо
P.S. Всё это дело пишу под VS 2005
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2008, 01:19     Строки+ООП=жесть?
Посмотрите здесь:

C++ Жесть а не код...
C++ ООП
ООП C++
ооп C++
C++ ООП
C++ ООП
C++ ООП
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
18.10.2008, 01:33     Строки+ООП=жесть? #2
В данном конкретном случае - точно жесть
Вот наводки:
1. Разберись с функциями членами классов. assign - функция класса string,ты вызываешь ее как глобальную.
2. Разберись с приватными и паблик переменными.в мэйне ты лезешь в приватные переменные при выводе.
3. Посмотри еще раз,что такое конструкторы и деструкторы. Ты пытаешься вернуть значение из конструктора
И,кстати,компилятор явно строки с ошибками указывает,и описание приводит. Это я к слову...
FLeX
0 / 0 / 0
Регистрация: 18.10.2008
Сообщений: 5
18.10.2008, 01:37  [ТС]     Строки+ООП=жесть? #3
1. Разберись с функциями членами классов. assign - функция класса string,ты вызываешь ее как глобальную.
2. Разберись с приватными и паблик переменными.в мэйне ты лезешь в приватные переменные при выводе.
3. Посмотри еще раз,что такое конструкторы и деструкторы. Ты пытаешься вернуть значение из конструктора
Спасибо, сделаем
И,кстати,компилятор явно строки с ошибками указывает,и описание приводит. Это я к слову...
Знаю. Уже просто пятый час бьюсь с программой, и вылезают новые и новые ошибки, уже даже номера не помогают, мозг квадратный. Щаз децл отдохнуть, и снова в бой
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
18.10.2008, 01:40     Строки+ООП=жесть? #4
FLeX,не спеши. Попробуй прогнать тестовые программы попроще,чтобы точно разобраться,как работают конструкторы,функции,объявленные в классе,перегрузка операторов. Потом соберешь вместе. Главное - до понимания добраться
FLeX
0 / 0 / 0
Регистрация: 18.10.2008
Сообщений: 5
18.10.2008, 02:12  [ТС]     Строки+ООП=жесть? #5
Я знаю Причем есть один хороший друг-программист, который говорит тоже самое (жаль, из другого города ). Фигня в том, что всё это по отдельности - работает на ура. Полно дурацких ошибок нашел, но это уже действительно потому что пока устранял глобальные, мозг окончательно умер. Будем исправляться
----
Кстати, в книжечке написано, что конструктором будет считаться тот метод класса, который имеет такое же имя. Получается, что в классе db конструктор отсутствует (то есть он будет, но дефолтовый, который создастся сам).
Поэтому же и не делал конструктора для db, ибо знал, что придется возвращать значение
----
Был не прав Ты, наверное, про класс monitor... Да, да, ступил я. Убрал эту строку

Добавлено через 19 минут 54 секунды
Немножко пофлужу с вашего позволения
Остался вот этот кусок кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class monitor
{
public:
    string type;
    int retail, wholesale;
    string comments;
    monitor(int id=1)
    {
        string str2;
        str2=db::read_string(id);
        type=string::_Assign(string& str2, 0, 8);
        wholesale=atoi(&str2[9]);
        retail=atoi(&str2[14]);
        comments=string::_Assign(string& str2,19,16);
    }
};
А конкретно строки с
C++
1
type=string::_Assign(string& str2, 0, 8);
и
C++
1
comments=string::_Assign(string& str2,19,16);
На что мне компилятор и ругается вот таким образом:
error C2275: 'std::string' : illegal use of this type as an expression
И вторая строка по аналогии. Я понимаю, что он говорит, но в книге описано именно таким образом, поэтому я в сомнениях Как правильно-то работать с функцией assign?
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
18.10.2008, 03:22     Строки+ООП=жесть? #6
Цитата Сообщение от FLeX Посмотреть сообщение
Я понимаю, что он говорит, но в книге описано именно таким образом, поэтому я в сомнениях Как правильно-то работать с функцией assign?
Это в какой книге?
все просто. Cамый цивилизованный метод доступа к ф-ям класса : через "."
str2.assign( /*параметры */ );

как минимум убери из вызова string & str2. Ссылочный тип работает так,что при вызове,если в прототипе указана ссылка,нужно указывать просто переменную этого типа. т.е просто str2 вместо string & str2. На крайняк, преобразования типов заключаются в (), т.е (string &) str2 тоже похоже на правду,хотя и не уверен.
FLeX
0 / 0 / 0
Регистрация: 18.10.2008
Сообщений: 5
18.10.2008, 03:32  [ТС]     Строки+ООП=жесть? #7
Ага, я уже нашел, но всё равно спасибо )
Итак, конечный код выглядит так:
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
#include "iostream"
#include "conio.h"
#include "stdio.h"
#include "string"
using namespace std;
 
class db
{
public:
    static string read_string(int string_number)
    {   
        FILE *file_input;
        if ((file_input = fopen("d:\\fi.txt", "r"))==0)
            {
        cout<<"Open entrance file error";
        getch();
    }
        string str1;
        const int length=36;
        fseek(file_input, (length+1)*string_number, SEEK_SET);
        fread(&str1, length-1, 1, file_input);
        fclose(file_input);
        return str1;    
    }
};
class monitor
{
public:
    string type;
    int retail, wholesale;
    string comments;
    monitor(int id=1)
    {
        string str2;
        str2=db::read_string(id);
        type.assign(str2, 0, 8);
        wholesale=atoi(&str2[9]);
        retail=atoi(&str2[14]);
        comments.assign(str2,19,16);
    }
};
 
int main()
{   
    int number_string;
    cout<<"Enter string number ";
    cin>>number_string;
    monitor output(number_string);
    cout<<"Type of monitor: "<<output.type<<"\nWholesale: "<<output.wholesale<<"\nRetail: "<<output.retail<<"\nComments: "<<output.comments;
    return 0;
}
Последняя проблема: после ввода номера строки и при начале работы метода класса db программа виснет. Почему - не знаю. Но путем проверки установлено, что точно при работе метода...
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
18.10.2008, 03:36     Строки+ООП=жесть? #8
отлаживай
расставь брек поинты, посмотри,что происходит) к сожалению,нет времени дать более детальных советов)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2008, 04:13     Строки+ООП=жесть?
Еще ссылки по теме:

C++ Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")
C++ ООП
C++ утечки памяти - просто жесть
Ввод строки, без ООП C++
ООП в С++ C++

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

Или воспользуйтесь поиском по форуму:
FLeX
0 / 0 / 0
Регистрация: 18.10.2008
Сообщений: 5
18.10.2008, 04:13  [ТС]     Строки+ООП=жесть? #9
Проблема решена!)
XuTPbIu_MuHTAu, отдельное спасибо.
Вся проблема оказалась в том, что функция fread не хотела работать с переменной типа string. Пришлось извращаться, выдавать ей чаровый массив, после работы с которым передавать его в стринговую переменную
Yandex
Объявления
18.10.2008, 04:13     Строки+ООП=жесть?
Ответ Создать тему
Опции темы

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