Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с inline ф-циями в классе 
:(
    Опции темы
NOT
Дата 23.11.2005, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 18.6.2005
Где: UA::CK

Репутация: нет
Всего: нет



Здравствуйте.
Компилятор MSVC 6.0
Есть файл CGameEngine.h с описанием двух классов:
класса CGameMesh(переменные и состояния объекта игры) и класс CGameEngine(),
в котором объявлены экземпляр CGameMesh GameMeshMatrix[120] и функции,
работающие с этим массивом эземпляров(CGameMesh GameMeshMatrix[120]).
Этот файл подключается в файл описания CGameEngine.cpp и WinMain.cpp.
Если эти функции объявлены как "inline", то выдает ошибку:
Linking...
WinMain.obj : error LNK2001: unresolved external symbol "public: void __thiscall CGameEngine::ScaleMeshesUp(int,float,float)" (?ScaleMeshesUp@CGameEngine@@QAEXHMM@Z)
Debug/CLASS.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

CLASS.exe - 2 error(s), 0 warning(s)

если как обычные - не выдает.

Вторая проблема: в файле WinMain создан экземпляр CGameEngine GameEngine.
Когда в WinMain.cpp пишу "GameEngine.GameMeshMatrix[от 0 до 119]. ",
то ничего не отображается( должны отображаться записанные переменные класса).
Когда создал проект заново и перенес в него все файлы и подключения, то начало отображаться.
Почему так? Хочу разобраться.
-------
Большое спасибо.
PM MAIL WWW   Вверх
Darhazer
Дата 23.11.2005, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 28.9.2005
Где: HellCity (Sofia, Bulgaria)

Репутация: 2
Всего: 29



Насчет inline
Нельзя пользувать inline функцию в другом класе/файлсе, кроме в том, в котором их дефинировал
Т.е. если в CGameMesh имееш inline функцию, ее можеш пользувать только в CGameMesh, а в WinMain нельзя!


--------------------
I'm a wheel, I'm a wheel, I can roll, I can feel
But you can't stop me turning
'Cause I'm the sun, I'm the sun, I can move, I can run
But you'll never stom me burning
PM MAIL WWW ICQ YIM   Вверх
NOT
Дата 23.11.2005, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 18.6.2005
Где: UA::CK

Репутация: нет
Всего: нет



Darhazer
Спасибо. Правда, так и есть, только что попробовал.
Спасибо.
Это минус C++ или моей архитектуры?

PM MAIL WWW   Вверх
Darhazer
Дата 23.11.2005, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 28.9.2005
Где: HellCity (Sofia, Bulgaria)

Репутация: 2
Всего: 29



это минус твоей архитектури
Подумай: что значить inline
это значить что вместо визове функции ти там поставил тело функции
А если эта функция - метод класа, как ты будеш пользуват ее без самого класа?
это возможно только для static метода....


--------------------
I'm a wheel, I'm a wheel, I can roll, I can feel
But you can't stop me turning
'Cause I'm the sun, I'm the sun, I can move, I can run
But you'll never stom me burning
PM MAIL WWW ICQ YIM   Вверх
NOT
Дата 23.11.2005, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 18.6.2005
Где: UA::CK

Репутация: нет
Всего: нет



Darhazer
А если эта функция - метод класа, как ты будеш пользуват ее без самого класа?[/quote]
Так я создаю экземпляр в файле(WinMain) где она вызывается, полуучается
Код

CGameEngine GameEngine;
GameEngine.Func();

PM MAIL WWW   Вверх
Darhazer
Дата 23.11.2005, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 28.9.2005
Где: HellCity (Sofia, Bulgaria)

Репутация: 2
Всего: 29



Да, но если функция inline, то вместо Func() в коде ставиться код функции...
И у нее уже нет доступа к GameEngine ;)


--------------------
I'm a wheel, I'm a wheel, I can roll, I can feel
But you can't stop me turning
'Cause I'm the sun, I'm the sun, I can move, I can run
But you'll never stom me burning
PM MAIL WWW ICQ YIM   Вверх
Neitron
Дата 23.11.2005, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



Эх многие новички, так и пытаются многое непонимание свалить на косяк стандарта.


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
NOT
Дата 23.11.2005, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 18.6.2005
Где: UA::CK

Репутация: нет
Всего: нет



Darhazer
Логично. Для меня это новость, т.к. никогда с таким не сталкивался.

Neitron
Неумение отвечать прямо на поставленный вопрос не подразумевает обязательного ответа...
PM MAIL WWW   Вверх
Vyacheslav
Дата 23.11.2005, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(NOT @ 23.11.2005, 16:33)
Darhazer
Логично. Для меня это новость, т.к. никогда с таким не сталкивался.

Neitron
Неумение отвечать прямо на поставленный вопрос не подразумевает обязательного ответа...

Ага. Логика -великая вещь smile С помощью логики можно доказать и опровергнуть все что угодно.
А по теме - Darhazer сказал чушь
Нет таких ограничений в С++


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
NOT
Дата 23.11.2005, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 18.6.2005
Где: UA::CK

Репутация: нет
Всего: нет



Vyacheslav
Цитата
А по теме - Darhazer сказал чушь
Нет таких ограничений в С++

Что итмеешь ввиду?
я могу делать как делал и ошибки не будет?
В простенькой программе по анологии ошибку выбивает тоже...
PM MAIL WWW   Вверх
Darhazer
Дата 23.11.2005, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 28.9.2005
Где: HellCity (Sofia, Bulgaria)

Репутация: 2
Всего: 29



По теме
Цитата

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.


Так что это может быт решение проблеми ;)

А насчет есть ли таких ограничений в C++ или нет - проверим

Это сообщение отредактировал(а) Darhazer - 23.11.2005, 16:59


--------------------
I'm a wheel, I'm a wheel, I can roll, I can feel
But you can't stop me turning
'Cause I'm the sun, I'm the sun, I can move, I can run
But you'll never stom me burning
PM MAIL WWW ICQ YIM   Вверх
Дрон
Дата 23.11.2005, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Хмм... Так вот оно что. Сталкивался я как-то с такой штукой.
Вполне логично, что раз inline функция находится в другой единице компиляции, то компилятор не может вставить её код место вызова. Так же логично, что если она будет в .h файле, то она будет существовать во всех единицах компиляции, её использующих.
Добавлено @ 16:59
Это как с шаблонами smile

Это сообщение отредактировал(а) Дрон - 23.11.2005, 16:58


--------------------
Да. Именно так.
PM   Вверх
Vyacheslav
Дата 23.11.2005, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(NOT @ 23.11.2005, 16:51)
Vyacheslav
Цитата
А по теме - Darhazer сказал чушь
Нет таких ограничений в С++

Что итмеешь ввиду?
я могу делать как делал и ошибки не будет?
В простенькой программе по анологии ошибку выбивает тоже...

Давай код простенькой программы, которая не собирается.
Дело в том, что по стандарту inline-функция отличается от обычной только на уровне компиляции. И все. Покажи как объявлял. Самый первый вариант : тело inline определял в cpp


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
NOT
Дата 23.11.2005, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 18.6.2005
Где: UA::CK

Репутация: нет
Всего: нет



Vyacheslav
Извините, электричество перебило.
h-file:
Код

class asd
{
public:
inline void func();
int i;
};


cpp-file:
Код

#include "stdafx.h"
#include "func.h"
#include <conio.h>

void asd::func()
{
    getch();
}


prog-file:
Код

#include "stdafx.h"
#include "func.h"
asd casd;
int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    casd.func();
    return 0;
}

PM MAIL WWW   Вверх
Daevaorn
Дата 23.11.2005, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



NOT
Всё понятно. Так делать нельзя. Раз уж пишешь inline, так уж будь добр реализацию метода в *.h файл писать.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0828 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.