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

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

Войти
Регистрация
Восстановить пароль
 
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
#1

Раздельная компиляция Namespace - Реализовать двусвязный список - C++

12.08.2014, 13:24. Просмотров 588. Ответов 11
Метки нет (Все метки)

В книге Страуструпа описана модульность с помощью namespace:
stack.c - хранит реализацию
stack.h- интерфейс
user.c - использование.
Там есть задачка реализовать двусвязный список по такому принципу.
С алгоритмом списка проблем нет, а вот с именами беда.
Для теста написал маленькую функцию, но и она не компилится ( main.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __cdecl List:op)

lists.c
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
#include "string"
#include "iostream"
#include"List.h"
int pop(std::string a)
{
    std::cout << a;
    return 0;
}

List.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
#include "string"
 
namespace List
{
    int pop(std::string);
}

main
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
#include "iostream"
#include "List.h"
#include "string"
int main()
{
    std::string a = "wwww";
    List::pop(a);
    system("pause");
    return 0;
}

Страницу с описанием этого же на примере стека знаю уже наизусть....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2014, 13:24     Раздельная компиляция Namespace - Реализовать двусвязный список
Посмотрите здесь:

Раздельная компиляция: как правильно реализовать многофайловый проект? (no matching function for call to...) - C++
Есть основной файл main.cpp #include &quot;header.hpp&quot; int hp_summ_a=2000, hp_summ_b=2000; int const N=20; int main(){ ...

Реализовать двусвязный список - C++
Доброго времени суток. Я получил задание в университете реализовать двусвязный список. В общем то с пониманием общей концепции списка /...

Реализовать двусвязный список и операции работы с ним - C++
Реализовать двусвязный список и операции работы с ним. В списке хранить, что пожелаете. Операции: - добавить в начало. - добавить...

Раздельная компиляция - C++
Пусть есть программа, которая состоит из 2 файлов. 1 файл: основной, там где main 2 файл: содержит некоторые функции Также есть...

Раздельная компиляция - C++
В Гугле не забанен,нашел описание самого принципа,но конкретных примеров не нашел. Вопросы вот какие: 1) Если у меня есть класс,...

раздельная компиляция - C++
Вот есть три файла: заголовочный файл с классом (.h), файл с реализацией методов класса (.cpp), и функцию main. Как, корректно, выполнить...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2014, 13:30     Раздельная компиляция Namespace - Реализовать двусвязный список #2
Вы объявили функцию pop в пространстве имен. Так и определяйте ее там же. Еще раз посмотретире пример со stack, видать, все таки, не наизусть знаете его.

C++
1
2
3
4
5
6
7
namespace List {
   int pop(std::string a)
   {
       std::cout << a;
       return 0;
   }
}
Добавлено через 2 минуты
Имена стандартных заголовков при включении нужно заключать в угловые скобки.

C++
1
2
#include <iostream>
#include <string>
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
12.08.2014, 13:34  [ТС]     Раздельная компиляция Namespace - Реализовать двусвязный список #3
Да нет, там объявление в другом файле и компилятор ищет объявление в файле интерфейса
фото с книги
Раздельная компиляция Namespace - Реализовать двусвязный список
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2014, 13:45     Раздельная компиляция Namespace - Реализовать двусвязный список #4
У меня есть эта книга. И я знаю о чем говорю.
Обратите внимание, как там выглядит определение:
C++
1
char Stack::pop() { ... }
Делайте по аналогии, от моего примера мало чем отличается:
C++
1
int List::pop() { ... }
А вообще - делайте лучше упражнения. Первые главы идут для ознакомелния.
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
12.08.2014, 13:49  [ТС]     Раздельная компиляция Namespace - Реализовать двусвязный список #5
Если определять функцию в том же имени что и реализацию, то при подключении имени будет доступна и реализация....
Так я упражнение и делаю, звучит оно так:
Раздельная компиляция Namespace - Реализовать двусвязный список
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2014, 13:54     Раздельная компиляция Namespace - Реализовать двусвязный список #6
Вообще ничего не понятно из Вашего сообщения.
Определение это и есть реализация.
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
12.08.2014, 13:55  [ТС]     Раздельная компиляция Namespace - Реализовать двусвязный список #7
Изменил файл lists.c:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
namespace List
{
    int pop(std::string a)
    {
        std::cout << a;
        return 0;
    }
}

Нечего не изменилось(((
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2014, 14:02     Раздельная компиляция Namespace - Реализовать двусвязный список #8
Этот файл добавлен в проект? Он компилируется при сборке проекта?
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
12.08.2014, 22:17  [ТС]     Раздельная компиляция Namespace - Реализовать двусвязный список #9
Блин, ну там в файле интерфейса видно только 2 функции

stack.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
namespace Stack
{
void push(char);
char pop();
}

main
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
#include "stack.h" // Включить интерфейс
void f()
{
   Stack::push('c');
   if(Stack::pop()!='c') error(''Error") // пример
}

stack.c ( в нем определение фукций и стека)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
#include "stack.h" // включить интерфейс
namespace Stack
{
   const int max_size=200;
  char v[max_size];
  int top=0
}
 
void Stack::push (char c) {.....}
char Stack::pop() {.....}


Добавлено через 5 минут
Да, скомпилировал...
Вот только и страуструп пишет по другому... По идее пользователь должен включить файл реализации и ему будет видны только функция pop и push, а в твоей реализации вообще нет смысла иметь файл интерфейса List.h потому как в main все равно будет видна реализация с файла Lists.c...

Добавлено через 13 минут
Как я понял ( я уже сомневаюсь что понял правильно) это сокрытия реализации по аналогии классов, чел подключает чисто интерфейс, а реализация ему не доступна, так же и сам страуструп пишет:
Гарантировать доступ к внутренней структуре стека исключительно через интерфейс пользователя...

Добавлено через 7 часов 54 минуты
ап!!
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.08.2014, 23:21     Раздельная компиляция Namespace - Реализовать двусвязный список #10
Цитата Сообщение от MousePro Посмотреть сообщение
ап!!
В чем вопрос-то на текущий момент?
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
12.08.2014, 23:33  [ТС]     Раздельная компиляция Namespace - Реализовать двусвязный список #11
Можно ли сделать так:
В 1 файле(пусть будет stack.c) определить реализацию, засунуть это все в namespace Stack;
В 2 файле ( stack.h) определить интерфейс - функции pop и pusр,переопределить пространство Stack, что бы при подключении файла Stack.h в main я мог обращаться только к pop и push, но не к реализации (массиву объектов например)?
Создать структуру типа класса только с помощью имен,в 9 посте под спойлером код если не понятно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2014, 23:42     Раздельная компиляция Namespace - Реализовать двусвязный список
Еще ссылки по теме:

Раздельная компиляция - C++
Здравствуйте, я перечитал на форуме информацию по этой теме, но пока что не сумел разобраться. У меня в проекте такие файлы: ...

Реализовать алгоритм простой вставки через двусвязный список - C++
Здравствуйте ! Нужно реализовать алгоритм простой вставки через двусвязный список Не понимаю как

Шаблоны и раздельная компиляция - C++
Здравствуйте! Если просто я пишу класс, например: class Test { private: int *pm; ... public: bool inc();

Раздельная компиляция и шаблоны - C++
Есть 3 файла с кодом: 1) foo.hpp template&lt;typename T&gt; class foo { public: T bar; foo(); ~foo(); };


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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.08.2014, 23:42     Раздельная компиляция Namespace - Реализовать двусвязный список #12
Пространство имен в первую очередь предназначено для разрешения конфликтов имен другого уровня: классов и функций. Безымянное пространство имен можно использовать для определения имен, доступных только в текущей единице трансляции. Если требуется скрыть реализацию того или иного класса следует для начала рассмотреть идиому pimpl.
Yandex
Объявления
12.08.2014, 23:42     Раздельная компиляция Namespace - Реализовать двусвязный список
Ответ Создать тему
Опции темы

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