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

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

Войти
Регистрация
Восстановить пароль
 
voltdem
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 3
#1

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

11.05.2011, 12:47. Просмотров 665. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2011, 12:47     не могу связать 2 файла через интерфес
Посмотрите здесь:

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

Как связать два файла с кодами? - C++
В одном файле вычисляется константа, которая используется при расчете функции в другом файле. Какой элементарный способ можно использовать,...

Как связать несколько классов через один общий класс? - C++
Здравствуйте. Есть несколько несвязанных классов, каждый из которых хранит указатель на один общий класс (посредник, устанавливается в...

Как связать два cpp файла в одном проекте (visual studio 2010) - C++
Есть два программы: одна создает файл.txt, вторая читает из него данные и выводит на экран. создает файл #include &lt;iostream&gt; ...

Не работает ввод имени файла через fget и открытие через fopen - C++
Уже все перепробовал и в гугле пару часов посидел. Но никак не пойму где проблема допустим в этом коде : char filename; char *p; ...

Запись файла через одно приложение, а чтение через другое - C++
Есть 2 консольные программы. 1-я пишет в файл &quot;z&quot; текст, 2-я читает с файла &quot;z&quot; этот текст и работает с ним. Подскажите как...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 631
11.05.2011, 12:52     не могу связать 2 файла через интерфес #2
не знаю прав я или нет(сам только месяц си++ изчаю), ну думаю что проблема в том, что файл 1.cpp нигде не подгружается
prZzZ
Программист
110 / 90 / 5
Регистрация: 22.03.2011
Сообщений: 233
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
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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++
Помогите пожалуйста, во вторник зачет, а я не как не могу решить задачу:( Описать функцию, вычисляющую значение...

Не могу получить строку через getline - C++
Есть класс class door { public: float squaredoor (); //функция расчета площади двери void printdoor ();...

Не могу вызвать функцию через указатель - C++
Есть функция void matrixsqr(int **a, int N, int M) как ее вызвать через указатель на функцию Добавлено через 18 минут Неужели никто...

Не могу открыть файл через argv[] - C++
Есть у меня int main(int argc, char *argv) { std::ifstream In(argv); ///.... } Через отладчик подаю 123 (у меня во всех...


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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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 файла через интерфес
Ответ Создать тему
Опции темы

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