Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
4 / 4 / 1
Регистрация: 14.07.2008
Сообщений: 39

Именованный конструктор + inline

19.08.2011, 13:53. Показов 4450. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую, Форумчане!

Следующий код, оформленный в одном файле работает на ура.
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
class Point2
{
public:
    static Point2 Decar(double dX, double dY);
    static Point2 Polar(double angle, double radius);
private:
    double dX;
    double dY;
    Point2(double dX, double dY);
};
 
inline Point2::Point2(double dX, double dY): dX(dX), dY(dY)
{
}
inline Point2 Point2::Decar(double dX, double dY)
{
    return Point2(dX, dY);
}
inline Point2 Point2::Polar(double angle, double radius)
{
    return Point2(radius * cos(angle), radius * sin(angle));
}
 
void main()
{
    Point2 point2 = Point2::Decar(1, 2);
    return;
}
Если же объявление класса вынести в отдельный заголовочный файл,
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Point2
{
public:
    static Point2 Decar(double dX, double dY);
    static Point2 Polar(double angle, double radius);
 
private:
    double dX;
    double dY;
 
    Point2(double dX, double dY);
};
а определение в отдельный cpp файл,
C++
1
2
3
4
5
6
7
8
9
10
11
inline Point2::Point2(double dX, double dY): dX(dX), dY(dY)
{
}
Point2 Point2::Decar(double dX, double dY)
{
    return Point2(dX, dY);
}
Point2 Point2::Polar(double angle, double radius)
{
    return Point2(radius * cos(angle), radius * sin(angle));
}
и затем проинклудить заголовочный файл, то линкер начинает ругаться на следующий код:
C++
1
2
3
4
5
void main()
{
    Point2 point2 = Point2::Decar(1, 2);
    return;
}
Error 1 error LNK2019: unresolved external symbol "public: static class Point2 __cdecl Point2:ecar(double,double)" (?Decar@Point2@@SA?AV1@NN@Z) referenced in function _main E:\Coding\C++\Win32\Named Constructor Idiom\MainUnit.obj

Отказ от спецификатора inline решает вопрос, но так и не дает понять причину такого поведения.
У кого-нибудь есть вразумительное объяснение?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.08.2011, 13:53
Ответы с готовыми решениями:

Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?
Здравствуйте. Знаю теорию, но не понимаю, на сколько должна быть маленькая функция, чтоб она подошла под inline ? Как...

inline функции vs инструкции inline функций
Здравствуйте. Чтобы не писать повторно код, нужно использовать функции. Но если функции компактные, то их лучше делать inline функциями, т....

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

9
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
19.08.2011, 13:58
правильно ругается. Мало просто заголовок подцепить. Надо еще cpp-сник откомпилировать.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
19.08.2011, 14:14
Цитата Сообщение от http://www.parashift.com/c++-faq/inline-functions.html
How do you tell the compiler to make a member function inline?

When you declare an inline member function, it looks just like a normal member function:

C++
1
2
3
4
class Fred {
  public:
    void f(int i, char c);
  };
But when you define an inline member function, you prepend the member function's definition with the keyword inline, and you put the definition into a header file:

C++
1
2
3
4
5
 inline
  void Fred::f(int i, char c)
  {
    ...
  }
It's usually imperative that the function's definition (the part between the {...}) be placed in a header file. If you put the inline function's definition into a .cpp file, and if it is called from some other .cpp file, you'll get an "unresolved external" error from the linker.
На сколько я понял со своим плохим английским, в твоем случае inline члены нужно определять в заголовочном файле, а не в cpp.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
19.08.2011, 14:15
Цитата Сообщение от villu Посмотреть сообщение
правильно ругается. Мало просто заголовок подцепить. Надо еще cpp-сник откомпилировать.
Ну так inline-функции имеют внутренне связывание... Грубо говоря, видны только в том файле, ГДЕ ОПРЕДЕЛЕНЫ.
Можно поставить extern перед inline - тогда будет видно везде.
1
19.08.2011, 14:20

Не по теме:

Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Ну так inline-функции имеют внутренне связывание...
Вот блин, сказывается то, что всегда делаю ф-ции inline'овыми путем определения их внутри класса, поэтому уже забыл про этот момент, пришлось вот гуглить)

0
4 / 4 / 0
Регистрация: 09.07.2010
Сообщений: 12
19.08.2011, 14:34
Потому что определение inline-функции должно быть доступно в той же единице трансляции, где используется.
Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"
#include <iostream>
#include "point2_inline.inl"
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    Point2 x = Point2::Decar(1,2);
    Point2 y = Point2::Polar(1,2);
 
    cin.get();
 
    return 0;
}
point2.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef _POINT2_H
#define _POINT2_H
 
class Point2
{
public:
    static Point2 Decar(double dX, double dY);
    static Point2 Polar(double angle, double radius);
 
private:
    double dX;
    double dY;
 
    Point2(double dX, double dY);
};
 
#endif
point2.inl
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <math.h>
#include "point2.h"
 
inline Point2::Point2(double dX, double dY): dX(dX), dY(dY)
{
}
inline Point2 Point2::Decar(double dX, double dY)
{
    return Point2(dX, dY);
}
inline Point2 Point2::Polar(double angle, double radius)
{
    return Point2(radius * cos(angle), radius * sin(angle));
}
2
4 / 4 / 1
Регистрация: 14.07.2008
Сообщений: 39
19.08.2011, 19:41  [ТС]
Цитата Сообщение от villu
правильно ругается. Мало просто заголовок подцепить. Надо еще cpp-сник откомпилировать.
Что вы имеете ввиду?

Цитата Сообщение от ValeryLaptev
Можно поставить extern перед inline - тогда будет видно везде.
Не помогло.

Цитата Сообщение от Gera777
Потому что определение inline-функции должно быть доступно в той же единице трансляции, где используется.
Спасибо. По ходу дела это точный ответ на мой вопрос.
Есть ли более элегантное решение этой задачи?
0
Заблокирован
19.08.2011, 21:26
У вас совершенно некорректный код! Конструктор не может иметь спецификатор static Уберите ключевое слово static из объявления ваших конструкторов класса Point2.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
19.08.2011, 21:31
Цитата Сообщение от Сыроежка Посмотреть сообщение
У вас совершенно некорректный код! Конструктор не может иметь спецификатор static Уберите ключевое слово static из объявления ваших конструкторов класса Point2.
???
Сыроежка, нужно хотя бы внимательно посмотреть на код, перед тем как его критиковать!
0
4 / 4 / 1
Регистрация: 14.07.2008
Сообщений: 39
20.08.2011, 12:15  [ТС]
Спасибо всем за участие.
Gera777 ответил на мой вопрос.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.08.2011, 12:15
Помогаю со студенческими работами здесь

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор)
class Test { int i; public: void test(int i) { this -&gt; i = i; } }; Конструктор Test::Test всегда вызывается...

Конструктор класса, конструктор копирования запускается не тот который нужен
Есть такой конструктор: Neuron::Neuron(int iType_activation_funk) { this-&gt;iType_act = iType_activation_funk; switch...

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром?
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;math.h&gt; #include &lt;algorithm&gt; using...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru