Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 3

не могу связать 2 файла через интерфес

11.05.2011, 12:47. Показов 1099. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Изучающий основы С++, поэтому моя проблема покажется многим дурацкой. Когда описываю класс TEXT в основном файле, то все проходит гладко. Но когда разбиваю их на 3 файла, то у меня не хочет в заголовочном файле работать со string-ом, включение using namespace std; в заголовочный файл по идее принесет проблемы, поэтому не использую. Файлы с исходным кодом представлены ниже, подскажите плиз)).
есть 3 файла

1_main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "1.h"
#include <iostream>
#include <conio.h>
#include <string>
#include <fstream>
using namespace std;
 
 
void main(){
        Text txt;
        cout << txt.contents() << endl;
        Text txt1("text.txt");
        cout << txt1.contents() << endl;
        getch();
}

1.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef TEXT
#define TEXT
#include <string>
 
class Text{
                string str;
        public:
                Text();
                Text(string fileName);
                ~Text();
                string contents();
};
 
#endif //TEXT

1.cpp

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
#include "1.h"
#include <string>
#include <fstream>
using namespace std;
 
Text::Text(){
        str = "";
}
 
Text::Text(string fileName){
        fstream file;
        str = "";
        string s;
        file.open(fileName.c_str(), fstream::in);
        while (getline(file, s)){
                str += s + "\n";
        }
        file.close();
}
 
Text::~Text(){}
 
string Text::contents(){
        return str;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.05.2011, 12:47
Ответы с готовыми решениями:

не могу зайти в веб-интерфес
Доброго времени суток! у меня возникла проблема,а точнее даже две... начну по порядку... Вчера приобрели с мужем роутер Dir-300 дабы...

Интерфес проги как интерфес VS
Хочу написать прогу, а интерфес позаимствовать у VS, больно он мне нравится и на мой взгляд очень удобный. Но вот не могу понять, как...

Не могу связать WPF с MS Access через DataGridView: Не удается получить данные схемы для таблицы или представления
Помогите пожалуйста при попытке связать форму с БД вылезает сообщение следующего вида: &quot;&lt;&gt; Не удается получить данные...

7
 Аватар для ЛеЖиК)
186 / 61 / 4
Регистрация: 29.04.2011
Сообщений: 641
11.05.2011, 12:52
не знаю прав я или нет(сам только месяц си++ изчаю), ну думаю что проблема в том, что файл 1.cpp нигде не подгружается
0
Программист
 Аватар для prZzZ
119 / 97 / 11
Регистрация: 22.03.2011
Сообщений: 244
11.05.2011, 13:17
Цитата Сообщение от ЛеЖиК) Посмотреть сообщение
не знаю прав я или нет(сам только месяц си++ изчаю), ну думаю что проблема в том, что файл 1.cpp нигде не подгружается
Подгружаться он должен в проекте...

voltdem, В файле 1.h вы обязаны использовать using namespace std, проблем это не принесет, в противном случае типы std вы должны описывать полностью:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef TEXT
#define TEXT
#include <string>
 
class Text{
                std::string str;
        public:
                Text();
                Text(std::string fileName);
                ~Text();
                std::string contents();
};
 
#endif //TEXT
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.05.2011, 13:40
Цитата Сообщение от prZzZ Посмотреть сообщение
voltdem, В файле 1.h вы обязаны использовать using namespace std
в заголовочных файлах обычно не открывают пространство имен, т.к. это приводит в свою очередь к неявному открытию этого пространства во всех файлах, которые используют этот хедер.

Цитата Сообщение от ЛеЖиК) Посмотреть сообщение
не знаю прав я или нет(сам только месяц си++ изчаю), ну думаю что проблема в том, что файл 1.cpp нигде не подгружается
файл 1.cpp будут неявно (если используется ide) линковаться к остальным файлам проекта
1
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 3
11.05.2011, 15:22  [ТС]
Цитата Сообщение от Nameless One Посмотреть сообщение
в заголовочных файлах обычно не открывают пространство имен, т.к. это приводит в свою очередь к неявному открытию этого пространства во всех файлах, которые используют этот хедер.


файл 1.cpp будут неявно (если используется ide) линковаться к остальным файлам проекта
Вот про это я и говорю, может поможет, но я использую Embarcadero RAD Studio 2010, в проекте присутствуют все 3 файла. В других случаях, если используются встроенные типы, или указатели на переменные, то все проходит нормально. Но приходится в заголовочном файле указывать тип void*, и делать преобразование типов данных в обоих файлах cpp.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.05.2011, 17:21
Цитата Сообщение от voltdem Посмотреть сообщение
В других случаях, если используются встроенные типы, или указатели на переменные, то все проходит нормально. Но приходится в заголовочном файле указывать тип void*, и делать преобразование типов данных в обоих файлах cpp.
Извини, не понял. Можешь привести пример?
0
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 3
12.05.2011, 12:20  [ТС]
Цитата Сообщение от Nameless One Посмотреть сообщение
Извини, не понял. Можешь привести пример?
2_main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "2_Stack.h"
#include <iostream>
#include <conio.h>
using namespace std;
 
void main(){
    Stack intStack;
    intStack.initialize();
    for (int i = 0; i < 10; i++) {
        int* px = new int;
        *px = i;
        intStack.push(px);
    }
 
    int* px;
    while((px = (int*) intStack.pop()) != 0){
        cout << *px << endl;
        delete px;
    }
 
    getch();
}
2_Stack.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef STACK_H
#define STACK_H
 
class Stack{
        struct Link{
            void* data;
            Link* next;
            void initialize(void*, Link*);
        }* head;
    public:
        void initialize();
        void push(void*);
        void* peek();
        void* pop();
        void cleanup();
};
#endif // STACK_H
Реализацию стека не привожу, но по сути можно в стек отправлять указатели на любой объект.

Добавлено через 18 часов 49 минут
все, подсказали ответ:
явно указывать полный путь в заголовочном файле при объявлении строки: std::string.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
12.05.2011, 18:30
Как я понял, ты хочешь, чтобы твой стек мог хранить элементы произвольного типа. Тогда тебе нужно почитать про шаблоны. Вот пример шаблонного стека:

stack.hpp:
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
#ifndef SAMPLE_STACK_HPP
#define SAMPLE_STACK_HPP
 
#include <cstdlib>
#include <stdexcept>
 
namespace sample
{
    // Определение шаблонного класса узла стека
    template <class T>
    struct node
    {
    node<T>* pnext;
    T value;
    node(const T&);
    node(const T&, node<T>*);
    };
 
    template <class T>
    node<T>::node(const T& val)
    : pnext(NULL), value(val)
    {
    }
 
    template <class T>
    node<T>::node(const T& val, node<T>* pn)
    : pnext(pn), value(val)
    {
    }
    
    // Определение шаблонного класса стека
    template <class T>
    class stack
    {
    protected:
    node<T>* ptop;
    size_t sz;
    public:
    stack();
    ~stack();
    
    void push(const T&);
    void pop();
    
    T& top();
    const T& peek() const;
    
    bool empty() const;
    size_t size() const;
    };
 
    template <class T>
    stack<T>::stack()
    : ptop(NULL), sz(0)
    {
    }
 
    template <class T>
    stack<T>::~stack()
    {
    while(ptop)
    {
        node<T>* pnode = ptop;
        ptop = ptop->pnext;
        delete pnode;
        pnode = NULL;
    }
    sz = 0;
    }
    
    template <class T>
    void stack<T>::push(const T& val)
    {
    node<T>* pnode = new node<T>(val, ptop);
    ptop = pnode;
    ++sz;
    }
 
    template <class T>
    void stack<T>::pop()
    {
    if(sz == 0)
        throw std::runtime_error("stack is empty");
 
    node<T>* pnode = ptop;
    ptop = ptop->pnext;
    delete pnode;
    pnode = NULL;
    --sz;
    }
 
    template <class T>
    T& stack<T>::top()
    {
    if(sz == 0)
        throw std::runtime_error("stack is empty");
 
    return ptop->value;
    }
 
    template <class T>
    const T& stack<T>::peek() const
    {
    if(sz == 0)
        throw std::runtime_error("stack is empty");
 
    return ptop->value;
    }
 
    template <class T>
    bool stack<T>::empty() const
    {
    return sz == 0;
    }
 
    template <class T>
    size_t stack<T>::size() const
    {
    return sz;
    }
}
 
#endif
main.cc:
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
#include <iostream>
#include "stack.hpp"
 
int main()
{
    
    sample::stack<int> istack;  // Стек, хранящий целые числа
    sample::stack<char> cstack; // Стек, хранящий символы
 
    const char* str = "stack";
 
    std::cout << "Stack of integers:" << std::endl;
    
    for(int i = -2; i <=2; ++i)
    {
    std::cout << "Pushing element " << i << std::endl;
    istack.push(i);
    }
    
    while(!istack.empty())
    {
    std::cout << "Poping element " << istack.peek() << std::endl;
    istack.pop();
    }
    std::cout << std::endl
          << "Stack of characters:" << std::endl;
    
    while(*str)
    {
    std::cout << "Pushing element " << *str << std::endl;
    cstack.push(*str++);
    }
 
    while(!cstack.empty())
    {
    std::cout << "Poping element " << cstack.peek() << std::endl;
    cstack.pop();
    }
    
    return 0;
}
И еще, обрати внимание: для инициализации и очистки объектов определяемых классов существуют специальные методы, которые неявно вызываются при создании объекта и при его удалении (т.е. при достижении конца контекста существования объекта или при вызове оператора delete для объекта), - это контрукторы (см. методы stack(), node(const T&), node(const T&, node<T>*) и деструкторы (см. методы ~stack() и ~node()). У этих методов отсутствует возвращаемое значение; имена конструкторов и деструкторов должно совпадать с именем класса, только у деструктора перед именем класса стоит символ "`" (тильда). Конструкторов может быть несколько (см. класс node), и они могу принимать различное число параметров, деструктор может быть только один, причем он не должен принимать параметров.
Преимущество использования конструкторов и деструкторов в том, что для статических объектов класса они вызываются автоматически, что избавляет программиста от контроля за корректным и своевременным выделением и освобождением памяти для полей объекта (к примеру, ты в своем примере забыл вызвать метов cleanup(), что в более сложной программе могло привести к серьезной (и трудноуловимой) ошибке, связанной с утечками памяти)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2011, 18:30
Помогаю со студенческими работами здесь

Могу ли я в form добавить два файла через action?
&lt;form method=&quot;post&quot; action=&quot;registration.php&quot; id=&quot;form_auth&quot;&gt; и надо что ещё через action добавить login.php .Как это...

Связать два компьютера с 1С через LAN или как то через выгрузку и загрузку даних
Требуется как то по простому связать два компа, чтобы на одном вводить расходы, а на другом приходы, и как то это обрабатывать. Я не имею...

не могу передать через строку браузера имя файла в переменную
всех приветствую.. новичку нужна помощь. задача простая до нельзя - есть много jpg картинок, каждую из них нужно с главной страницы...

Интерфес win32 MS VS 10
Помогите запихнуть прогу в мастер win32 в MS VS 10 Дело в том,сам мастер из элементов управления создает только контекстное меню ...

Форма, интерфес, окна.
Всем привет. Чем посоветуете создать красивый интерфейс для програм под Pascal, знаю в Pascal ABC есть такой раздел как &quot;создать...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. fontSize": 18, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations":. . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru