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

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

Восстановить пароль Регистрация
 
voltdem
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 3
11.05.2011, 12:47     не могу связать 2 файла через интерфес #1
Изучающий основы С++, поэтому моя проблема покажется многим дурацкой. Когда описываю класс 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
11.05.2011, 12:52     не могу связать 2 файла через интерфес #2
не знаю прав я или нет(сам только месяц си++ изчаю), ну думаю что проблема в том, что файл 1.cpp нигде не подгружается
prZzZ
Программист
 Аватар для prZzZ
108 / 88 / 5
Регистрация: 22.03.2011
Сообщений: 232
11.05.2011, 13:17     не могу связать 2 файла через интерфес #3
Цитата Сообщение от ЛеЖиК) Посмотреть сообщение
не знаю прав я или нет(сам только месяц си++ изчаю), ну думаю что проблема в том, что файл 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
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
11.05.2011, 13:40     не могу связать 2 файла через интерфес #4
Цитата Сообщение от prZzZ Посмотреть сообщение
voltdem, В файле 1.h вы обязаны использовать using namespace std
в заголовочных файлах обычно не открывают пространство имен, т.к. это приводит в свою очередь к неявному открытию этого пространства во всех файлах, которые используют этот хедер.

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


файл 1.cpp будут неявно (если используется ide) линковаться к остальным файлам проекта
Вот про это я и говорю, может поможет, но я использую Embarcadero RAD Studio 2010, в проекте присутствуют все 3 файла. В других случаях, если используются встроенные типы, или указатели на переменные, то все проходит нормально. Но приходится в заголовочном файле указывать тип void*, и делать преобразование типов данных в обоих файлах cpp.
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
11.05.2011, 17:21     не могу связать 2 файла через интерфес #6
Цитата Сообщение от voltdem Посмотреть сообщение
В других случаях, если используются встроенные типы, или указатели на переменные, то все проходит нормально. Но приходится в заголовочном файле указывать тип void*, и делать преобразование типов данных в обоих файлах cpp.
Извини, не понял. Можешь привести пример?
voltdem
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 3
12.05.2011, 12:20  [ТС]     не могу связать 2 файла через интерфес #7
Цитата Сообщение от 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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2011, 18:30     не могу связать 2 файла через интерфес
Еще ссылки по теме:

Как связать два файла с кодами? C++
C++ Не удаётся связать два файла timer.h и timer.cpp
Запись файла через одно приложение, а чтение через другое C++

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
12.05.2011, 18:30     не могу связать 2 файла через интерфес #8
Как я понял, ты хочешь, чтобы твой стек мог хранить элементы произвольного типа. Тогда тебе нужно почитать про шаблоны. Вот пример шаблонного стека:

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(), что в более сложной программе могло привести к серьезной (и трудноуловимой) ошибке, связанной с утечками памяти)
Yandex
Объявления
12.05.2011, 18:30     не могу связать 2 файла через интерфес
Ответ Создать тему
Опции темы

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