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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
FLeX
0 / 0 / 0
Регистрация: 18.10.2008
Сообщений: 5
#1

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

18.10.2008, 01:19. Просмотров 2490. Ответов 8
Метки нет (Все метки)

Я, наверное, зря начал освоение ООПа с 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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2008, 01:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Строки+ООП=жесть? (C++):

Жесть а не код... - C++
Доброго времени суток всем кто на этом прекрасном ресурсе. Ну как обычно: в С++ я новичок, я больше по web и т.д. Люди, нужна помощь. Есть...

утечки памяти - просто жесть - C++
analysis *SP; // объявляем классы SP = new analysis(Edit1-&gt;Text); //загружаем данные SP = new analysis(Edit2-&gt;Text); //загружаем данные...

Ввод строки, без ООП - C++
void deletesymbol(string size) { printf(&quot;Программа считывает строку, после удаляет чётные слова. \n&quot;); string arStr; int N = 0; ...

Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ") - C++
Лафоре &quot;ООП в Си ++ &quot; - проблемы с упражнением 12, глава 7 Условие: Напишите программу, которая будет принимать от пользователя две...

ООП - C++
Прочитал в википедии про ООП, но так толком и не понял. Подскажите, чем является создание программ с интерфейсом, допустим как калькулятор...

ООП - C++
Господа у меня возникло 2 вопроса по ООП т.к. только не давно начал его изучать . 1) Не как не могу понять для чего умные люди его...

8
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
18.10.2008, 01:33 #2
В данном конкретном случае - точно жесть
Вот наводки:
1. Разберись с функциями членами классов. assign - функция класса string,ты вызываешь ее как глобальную.
2. Разберись с приватными и паблик переменными.в мэйне ты лезешь в приватные переменные при выводе.
3. Посмотри еще раз,что такое конструкторы и деструкторы. Ты пытаешься вернуть значение из конструктора
И,кстати,компилятор явно строки с ошибками указывает,и описание приводит. Это я к слову...
0
FLeX
0 / 0 / 0
Регистрация: 18.10.2008
Сообщений: 5
18.10.2008, 01:37  [ТС] #3
1. Разберись с функциями членами классов. assign - функция класса string,ты вызываешь ее как глобальную.
2. Разберись с приватными и паблик переменными.в мэйне ты лезешь в приватные переменные при выводе.
3. Посмотри еще раз,что такое конструкторы и деструкторы. Ты пытаешься вернуть значение из конструктора
Спасибо, сделаем
И,кстати,компилятор явно строки с ошибками указывает,и описание приводит. Это я к слову...
Знаю. Уже просто пятый час бьюсь с программой, и вылезают новые и новые ошибки, уже даже номера не помогают, мозг квадратный. Щаз децл отдохнуть, и снова в бой
0
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
18.10.2008, 01:40 #4
FLeX,не спеши. Попробуй прогнать тестовые программы попроще,чтобы точно разобраться,как работают конструкторы,функции,объявленные в классе,перегрузка операторов. Потом соберешь вместе. Главное - до понимания добраться
0
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?
0
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
18.10.2008, 03:22 #6
Цитата Сообщение от FLeX Посмотреть сообщение
Я понимаю, что он говорит, но в книге описано именно таким образом, поэтому я в сомнениях Как правильно-то работать с функцией assign?
Это в какой книге?
все просто. Cамый цивилизованный метод доступа к ф-ям класса : через "."
str2.assign( /*параметры */ );

как минимум убери из вызова string & str2. Ссылочный тип работает так,что при вызове,если в прототипе указана ссылка,нужно указывать просто переменную этого типа. т.е просто str2 вместо string & str2. На крайняк, преобразования типов заключаются в (), т.е (string &) str2 тоже похоже на правду,хотя и не уверен.
0
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 программа виснет. Почему - не знаю. Но путем проверки установлено, что точно при работе метода...
0
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
18.10.2008, 03:36 #8
отлаживай
расставь брек поинты, посмотри,что происходит) к сожалению,нет времени дать более детальных советов)
0
FLeX
0 / 0 / 0
Регистрация: 18.10.2008
Сообщений: 5
18.10.2008, 04:13  [ТС] #9
Проблема решена!)
XuTPbIu_MuHTAu, отдельное спасибо.
Вся проблема оказалась в том, что функция fread не хотела работать с переменной типа string. Пришлось извращаться, выдавать ей чаровый массив, после работы с которым передавать его в стринговую переменную
0
18.10.2008, 04:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2008, 04:13
Привет! Вот еще темы с ответами:

ООП - C++
помогите пожалуйста лабу сделать. не понимаю чет как ее делать((( я 7 вариант

ООП - C++
Создать класс Vegetable, содержащий следующие элементы: - поле «вес» float Mass; - поле «зрелость» int Ripeness; - метод получения...

ООП в С++ - C++
Здравствуйте! Ответьте пожалуйста на несколько вопросов... p.s. буду рад , если ответы будут сопровождаться примерами :) Хочу...

ООП - C++
#pragma hdrstop #pragma argsused //#include &quot;Student.hpp&quot; //#include &quot;Prof.hpp&quot; //#include &quot;Personne.hpp&quot; #include &lt;conio.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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