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

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

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

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

28.02.2014, 22:25. Просмотров 306. Ответов 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++ Пространство имен
C++ пространство имен
C++ Пространство имен в многофайловной программе
Пространство имен std C++
C++ Пространство имен std
C++ Как узнать пространство имен?
пространство имен C++
Включение класса в пространство имен C++
Пространство имен C++
Класс и пространство имен C++
C++ Пространство имен
C++ Пространство имен

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
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;
}
 
}
Я только недавно писал об этом.
Yandex
Объявления
28.02.2014, 23:23     Пространство имен
Ответ Создать тему
Опции темы

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