0 / 0 / 0
Регистрация: 06.11.2015
Сообщений: 18
1

Как правильно заявлять пространство имён для содержимого модулей?

01.07.2018, 21:42. Показов 612. Ответов 9
Метки нет (Все метки)

Снова здравствуйте. При попытке скомпилировать следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "circle.hpp"
#include "rectangle.hpp"
#include <conio.h>
using namespace std;
namespace trt
{
    class Shape;
    class Circle;
    class Rectangle;
}
 
int main()
{
    trt::Circle crc(3,3,-3);
    trt::Rectangle rct(3,3,3,3);
    return 0;
}
появляется ошибка
[Error] variable 'tkach::Circle crc' has initializer but incomplete type
[Error] variable 'tkach::Rectangle rct' has initializer but incomplete type
99%, что я просто неправильно прописал пространство имён, но как правильно их прописывать в моём случае я нигде не нашёл.
Rectangle и Circle модули построены полностью одинаково, так что выкладываю только circle:
Кликните здесь для просмотра всего текста

.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef CIRCLEHPP
#define CIRCLEHPP
#include <cmath>
#include "base-types.hpp"
#include "shape.hpp"
class Circle: public Shape 
{
    public:
    float rad; //ðàäèóñ
    point_t pos; //öåíòð ôèãóðû
    Circle(float c1,float c2, float c3);
    float getArea() override;
    rectangle_t getFrameRect() override;
    void move(bool method, float new_x, float new_y) override; //method True - ïåðåìåùåíèå â òî÷êó, False - ñìåùåíèå
    void scale(float factor) override;
};
#endif
.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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "circle.hpp"
 
Circle::Circle(float c1,float c2,float c3)// êà÷åñòâå ðàäèóñà èñïîëüçóåòñÿ ìîäóëü ââåä¸ííîãî çíà÷åíèÿ.
    {
        pos.x = c1;
        pos.y = c2;
        rad = abs(c3);
    }
float Circle::getArea()
    {
        return pow(M_PI*rad,2);
    }
rectangle_t Circle::getFrameRect()
    {
        rectangle_t x;
        x.pos.x=pos.x;
        x.pos.y=pos.y;
        x.heigth=rad*2;
        x.width=x.heigth;
        return x;
    }
void Circle::move(bool method, float new_x, float new_y)//method true - ïåðåìåùåíèå â òî÷êó, method false - ñìåùåíèå 
    {
        if (method==true)
        {
            pos.x=new_x;
            pos.y=new_y;
        }
        else
        {
            pos.x+=new_x;
            pos.y+=new_y;
        }
    }
void Circle::scale(float factor)
    {
        if (factor>=0)
        {
            rad=rad*factor;
        }
        else
        {
            cout << "Error: Measures can't be less than 0. \n";
        }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2018, 21:42
Ответы с готовыми решениями:

Как правильно добавить в пространство имен?
нужно добавить в пространство имен в заголовочном файле. //1.cpp с исходным кодом namespace...

Как правильно импортировать ссылку в проект и ее пространство имен?
Добавляю в программу ссылки на dll ссылки -&gt; добавить ссылку... -&gt; обзор.. -&gt; выбираю dll -&gt; ok...

Как прописать пространство имён для Actions?
ИСПОЛЬЗУЕТСЯ: C#, WebDriver, Chrome, VisualStudio 2015 Visual Studio Выдаёт ошибку: The type or...

Создание своего контрола на основе существующего. Не могу правильно задать пространство имён
WPF. К контролам предъявляются примерно одинаковые требования. В общем, надоело писать кучу...

9
Заблокирован
01.07.2018, 22:09 2
В файле с main-функцией должно быть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "circle.hpp"
#include "rectangle.hpp"
#include <conio.h>
using namespace std;
 
// говорим, какие идентификаторы из trt будем использовать тут
using trt::Shape;
using trt::Circle;
using trt::Rectangle;
 
int main()
{
    Circle crc(3,3,-3);
    Rectangle rct(3,3,3,3);
    return 0;
}
Добавлено через 48 секунд
или так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "circle.hpp"
#include "rectangle.hpp"
#include <conio.h>
using namespace std;
 
// говорим, что все идентификаторы из trt будем здесь использовать
using namespace trt;
 
int main()
{
    trt::Circle crc(3,3,-3);
    trt::Rectangle rct(3,3,3,3);
    return 0;
}
Добавлено через 3 минуты
Файл с классом Circle надо делать так:

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
#ifndef CIRCLEHPP
#define CIRCLEHPP
#include <cmath>
#include "base-types.hpp"
#include "shape.hpp"
 
// говорим, что класс Circle из trt
namespace trt {
 
class Circle: public Shape 
{
    public:
    float rad; //Г°Г*äèóñ
    point_t pos; //Г¶ГҐГ*ГІГ° ôèãóðû
    Circle(float c1,float c2, float c3);
    float getArea() override;
    rectangle_t getFrameRect() override;
    void move(bool method, float new_x, float new_y) override; //method True - ïåðåìåùåГ*ГЁГҐ Гў òî÷êó, False - ñìåùåГ*ГЁГҐ
    void scale(float factor) override;
};
 
}
 
#endif
Добавлено через 1 минуту
В файле с реализацией класса надо так:

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
#include "circle.hpp"
 
// говорим, что используем trt
using namespace trt;
 
Circle::Circle(float c1,float c2,float c3)//Г‚ ГЄГ*Г·ГҐГ±ГІГўГҐ Г°Г*äèóñГ* èñïîëüçóåòñÿ ìîäóëü ââåä¸Г*Г*îãî Г§Г*Г*Г·ГҐГ*ГЁГї.
    {
        pos.x = c1;
        pos.y = c2;
        rad = abs(c3);
    }
float Circle::getArea()
    {
        return pow(M_PI*rad,2);
    }
rectangle_t Circle::getFrameRect()
    {
        rectangle_t x;
        x.pos.x=pos.x;
        x.pos.y=pos.y;
        x.heigth=rad*2;
        x.width=x.heigth;
        return x;
    }
void Circle::move(bool method, float new_x, float new_y)//method true - ïåðåìåùåГ*ГЁГҐ Гў òî÷êó, method false - ñìåùåГ*ГЁГҐ 
    {
        if (method==true)
        {
            pos.x=new_x;
            pos.y=new_y;
        }
        else
        {
            pos.x+=new_x;
            pos.y+=new_y;
        }
    }
void Circle::scale(float factor)
    {
        if (factor>=0)
        {
            rad=rad*factor;
        }
        else
        {
            cout << "Error: Measures can't be less than 0. \n";
        }
    }
Добавлено через 1 минуту
Или так:

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
#include "circle.hpp"
 
// говорим, что все дальнейшие функции из trt (до закрывающей скобки "namespace")
namespace trt {
 
Circle::Circle(float c1,float c2,float c3)//Г‚ ГЄГ*Г·ГҐГ±ГІГўГҐ Г°Г*äèóñГ* èñïîëüçóåòñÿ ìîäóëü ââåä¸Г*Г*îãî Г§Г*Г*Г·ГҐГ*ГЁГї.
    {
        pos.x = c1;
        pos.y = c2;
        rad = abs(c3);
    }
float Circle::getArea()
    {
        return pow(M_PI*rad,2);
    }
rectangle_t Circle::getFrameRect()
    {
        rectangle_t x;
        x.pos.x=pos.x;
        x.pos.y=pos.y;
        x.heigth=rad*2;
        x.width=x.heigth;
        return x;
    }
void Circle::move(bool method, float new_x, float new_y)//method true - ïåðåìåùåГ*ГЁГҐ Гў òî÷êó, method false - ñìåùåГ*ГЁГҐ 
    {
        if (method==true)
        {
            pos.x=new_x;
            pos.y=new_y;
        }
        else
        {
            pos.x+=new_x;
            pos.y+=new_y;
        }
    }
void Circle::scale(float factor)
    {
        if (factor>=0)
        {
            rad=rad*factor;
        }
        else
        {
            cout << "Error: Measures can't be less than 0. \n";
        }
    }
}
Добавлено через 5 минут
Ну или просто писать при реализации каждого метода идентификатор "trt". Например, для конструктора так: "trt::Circle::Circle...".
0
0 / 0 / 0
Регистрация: 06.11.2015
Сообщений: 18
01.07.2018, 22:30  [ТС] 3
А теперь такой вопрос: у меня есть классы в двух разных модулях (circle.hpp и rectangle.hpp) Как запихнуть из этих двух файлов классы в одно пространство имён?
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
01.07.2018, 22:43 4
derasoft, rectangle.hpp наследует что нить? или самостоятельный?

А вообще одно пространственное имя один файл. нечего бить
0
0 / 0 / 0
Регистрация: 06.11.2015
Сообщений: 18
01.07.2018, 23:01  [ТС] 5
Mesteriis, rectangle наследует ещё два класса
По условию задания требуется вынести все классы фигур в одно пространство имён
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
01.07.2018, 23:07 6
derasoft, ну объяви все в одном файле. а потом будешь описывать где хочешь. зачем путать линковщик лишними действиями. тем более на win
0
0 / 0 / 0
Регистрация: 06.11.2015
Сообщений: 18
01.07.2018, 23:19  [ТС] 7
Mesteriis, проблема в том, что по заданию требуется именно что прописать два класса в разных файлах, а потом запихнуть оба классов одно пространство имён. Или я чего-то не понял из твоего объяснения?
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
01.07.2018, 23:25 8
derasoft, А дайка само задание можно в личку картинкой. Смотри объяви все классы в одном файле а реализацию уже разведи по файлам. хотя это конечно тупость. + могу что то путать но по моему имя наследуется
0
Заблокирован
02.07.2018, 00:55 9
Цитата Сообщение от derasoft Посмотреть сообщение
А теперь такой вопрос: у меня есть классы в двух разных модулях (circle.hpp и rectangle.hpp) Как запихнуть из этих двух файлов классы в одно пространство имён?
Предлагаю почитать для начала справочную информацию про "namespace", может тогда жить станет легче . Можно описывать одно "namespace" в разных файлах. Вот пример.

main.cc:
C++
1
2
3
4
5
6
7
8
9
10
11
#include "b.hh"
#include "a.hh"
 
using namespace MyNameSpace;
 
int main() {
    B b;
    A a;
    
    return 0;
}
b.hh:
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
 
namespace MyNameSpace {
 
class B {
public:
    B();
};
 
}
b.cc:
C++
1
2
3
4
5
6
#include <iostream>
#include "b.hh"
 
MyNameSpace::B::B() {
    std::cout << "create object: class B\n";
}
a.hh:
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
 
namespace MyNameSpace {
 
class A {
public:
    A();
};
 
}
a.cc:
C++
1
2
3
4
5
6
#include <iostream>
#include "a.hh"
 
MyNameSpace::A::A() {
    std::cout << "create object: class A\n";
}
0
Велосипедист...
352 / 219 / 73
Регистрация: 15.12.2015
Сообщений: 785
02.07.2018, 02:31 10
Цитата Сообщение от Mesteriis Посмотреть сообщение
derasoft, ну объяви все в одном файле. а потом будешь описывать где хочешь. зачем путать линковщик лишними действиями. тем более на win
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2018, 02:31
Помогаю со студенческими работами здесь

Пространство имен для шаблонного класса
template&lt;class T&gt; class BaseClass { T data; void show(); } Подскажите пожалуйста как...

Пространство имен для пользовательского скрипта
Всем привет, сел разбираться с greasemonkey, по ходу возникла одна проблема. Как мне...

Пространство имен для работы с virtual WiFi
есть ли пространство имен для работы с virtual WiFi?

Как узнать пространство имен?
Здравствуйте, возникла ситуация, при которой нужно явно указать, к какому пространству имен...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru