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

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

Войти
Регистрация
Восстановить пароль
 
malfoi
50 / 50 / 15
Регистрация: 17.12.2013
Сообщений: 333
#1

Пространство имен - C++

28.02.2014, 22:25. Просмотров 327. Ответов 1
Метки нет (Все метки)

Здравствуйте, имеется код :

triangle.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef TRIANGLE_H_INCLUDED
#define TRIANGLE_H_INCLUDED
 
namespace TRG {
    struct Point {
        int x, y;
    };
    struct Triangle {
        Point a, b, c;
    };
}
 
#endif
functions.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef FUNCTIONS_H_INCLUDED
#define FUNCTIONS_H_INCLUDED
#include "triangle.h"
 
namespace TRG {
    double GetArea(Triangle);
    double GetDist(Point, Point);
    void print(Triangle);
}
 
#endif
functions.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 "functions.h"
#include <cmath>
#include <iostream>
 
using namespace TRG;
 
double GetDist(Point pt1, Point pt2) {
    double dist = std::sqrt((double) ((pt1.x - pt2.x) * (pt1.x - pt2.x) + (pt1.y - pt2.y) * (pt1.y - pt2.y)));
    return dist;
}
 
double GetArea(Triangle trg) {
    double a = GetDist(trg.a, trg.b),
           b = GetDist(trg.a, trg.c),
           c = GetDist(trg.b, trg.c);
    double p = (a + b + c) / 2;
    double area = std::sqrt(p * (p - a) * (p - b) * (p - c));
    return area;
}
 
void print(Triangle trg) {
    std::cout << "a: " << trg.a.x << " " << trg.a.y << std::endl;
    std::cout << "b: " << trg.b.x << " " << trg.b.y << std::endl;
    std::cout << "c: " << trg.c.x << " " << trg.c.y << std::endl;
}
main.cpp
C++
1
2
3
4
5
6
7
#include <iostream>
#include "functions.h"
 
int main() {
 
    return 0;
}
В итоге ошибка о том, что он не знает к чему обращаться при нахождении a, b, c в файле functions.cpp
double GetDist(TRG::Point, TRG::Point) или TRG::double GetDist(TRG::Point, TRG::Point)

Если при описании функции вместо GetDist после using namespace написать TRG::GetDist, т.е.
C++
1
2
3
4
double TRG::GetDist(Point pt1, Point pt2) {
    double dist = std::sqrt((double) ((pt1.x - pt2.x) * (pt1.x - pt2.x) + (pt1.y - pt2.y) * (pt1.y - pt2.y)));
    return dist;
}
то все ок, почему так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2014, 22:25     Пространство имен
Посмотрите здесь:

Пространство имен - C++
Как составить код, когда необходимо использовать классы и методы из разных пространств имен. К примеру используется cout из std и...

Пространство имен - C++
Подскажите, пожалуйста. Если я создам своё пространство имен и в нем создам функцию, например, abc() и при использовании в main() using...

пространство имен - C++
Один практикующий программист сказал мне, что пространство именusing namespace std; нежелательно объявлять в начале программы, а лучше...

Пространство имен std - C++
Какой стиль лучше ? using std::cout; using std::endl; or using namespace std;

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

Как узнать пространство имен? - C++
Здравствуйте, возникла ситуация, при которой нужно явно указать, к какому пространству имен относится функция Ellipse. Я только начал...

Пространство имен в многофайловной программе - C++
Всем привет! Yashman, у которого часто что-то не получается снова в сети с новой проблеммой! :) Вот написал программу, а она не...

Включение класса в пространство имен - C++
Доброго времени суток! Имеется пространство имен, в котором планируют жить классы. Структура: namespace EVE { namespace Actions ...

вопрос про глобальное пространство имен - C++
#include &lt;iostream&gt; namespace { int a = 1; } int main() { using std::cout; int a = 5;

Как правильно добавить в пространство имен? - C++
нужно добавить в пространство имен в заголовочном файле. //1.cpp с исходным кодом namespace AAA { int T; } /// AAA::T=5; ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
28.02.2014, 23:23     Пространство имен #2
malfoi, потому что using namespace TRG; "импортирует" имена в текущее пространство имен (в данном случае в глобальное). А не делает все, что ниже, частью TRG. Из-за этого и появляются две функции, одна в namespace TRG, другая в глобальном. Надо делать так:
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
#include "functions.h"
#include <cmath>
#include <iostream>
 
namespace TRG
{
 
double GetDist(Point pt1, Point pt2) {
    double dist = std::sqrt((double) ((pt1.x - pt2.x) * (pt1.x - pt2.x) + (pt1.y - pt2.y) * (pt1.y - pt2.y)));
    return dist;
}
 
double GetArea(Triangle trg) {
    double a = GetDist(trg.a, trg.b),
           b = GetDist(trg.a, trg.c),
           c = GetDist(trg.b, trg.c);
    double p = (a + b + c) / 2;
    double area = std::sqrt(p * (p - a) * (p - b) * (p - c));
    return area;
}
 
void print(Triangle trg) {
    std::cout << "a: " << trg.a.x << " " << trg.a.y << std::endl;
    std::cout << "b: " << trg.b.x << " " << trg.b.y << std::endl;
    std::cout << "c: " << trg.c.x << " " << trg.c.y << std::endl;
}
 
}
Я только недавно писал об этом.
Ответ Создать тему
Опции темы

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