Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 17.12.2010, 18:14   #16
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Undefined reference to...

короче попробуй вместо =0 сделать
virtual void Update()
{
}
virtual Animal* Create()
{
}
(Offline)
 
Ответить с цитированием
Старый 17.12.2010, 18:22   #17
wolfhound512
Знающий
 
Аватар для wolfhound512
 
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений
(для 299 пользователей)
Ответ: Undefined reference to...

Я к "элите" С++ не отношусь, поэтому попробую помочь.

В 2008-й студии этот код компилируется нормально, и даже работает. Думаю что для твоего компилятора просто стоит указать квалификатор "virtual"
class Animal1 : public Animal
{
      public:
             virtual void Update();
             virtual Animal* Create();
      protected:
};
Кроме того не ясно зачем тебе виртуальная функция Create. Если я правильно понял ее назначение, то тебе следует сделать ее статической (static)

UPD: Нет, virtual указывать не обязательно, ошибка наверное действительно "где-то в коде, который нам не был продемонстрирован"
__________________
GUI, GUIw512, AlbaLynx, Форум
(Offline)
 
Ответить с цитированием
Старый 17.12.2010, 18:38   #18
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Undefined reference to...

Сообщение от Mr_F_ Посмотреть сообщение
короче попробуй вместо =0 сделать
virtual void Update()
{
}
virtual Animal* Create()
{
}
Я это и имел в виду. Только вот Create() возвращать еще че-то должен.
__________________

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (17.12.2010)
Старый 17.12.2010, 18:45   #19
wolfhound512
Знающий
 
Аватар для wolfhound512
 
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений
(для 299 пользователей)
Ответ: Undefined reference to...

Сообщение от .Squid Посмотреть сообщение
Я это и имел в виду. Только вот Create() возвращать еще че-то должен.
А если ему нужен именно абстрактный класс?
__________________
GUI, GUIw512, AlbaLynx, Форум
(Offline)
 
Ответить с цитированием
Старый 17.12.2010, 18:50   #20
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Undefined reference to...

Сообщение от wolfhound512 Посмотреть сообщение
А если ему нужен именно абстрактный класс?
Ну, я предполагаю, что ошибка где-то в коде, который нам не был продемонстрирован.
__________________

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
Mr_F_ (17.12.2010), Reizel (17.12.2010)
Старый 17.12.2010, 23:58   #21
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: Undefined reference to...

Блин, я забыл, что функция Create() статичной должна быть, переписал - все заработало...

...и даже правильно заработало!

UPD Dev C++ странная IDE какая-то: при первой попытке скомпилить код - выдает кучу варнингов, даже если нет ошибок, а работает только после повторного нажатия f9

Сообщение от Knightmare Посмотреть сообщение
Если начинающий - идиот, то зафига тут изображать из себя кэпа объясняя ему очевидные вещи?
Я этот код написал через 10 минут прочтения книги по С++, и у некоторых он даже работал. А раз ты такой "умный", хуле ж сразу не объяснил чо к чему?? Че то от тебя еще не замечено было нормальных постов, а?
(Offline)
 
Ответить с цитированием
Старый 18.12.2010, 04:21   #22
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Undefined reference to...

Можно сделать вот так:
class.hpp
#ifndef __CLASS_H__
#define __CLASS_H__

#include <stdio.h>
#include <iostream>

// Абстрактный базовый класс животного
class Animal {
protected:
	short maxHealth; // Максимальное количество HP
	
public:
	Animal(short h); // Конструктор класса в который можно передавать количество HP
	virtual Animal* Create() = 0; // Интерфейс для доступа к виртуальным методам суперклассов
	
	// Статическая функция с шаблоном вида животного.
	// Статическая для того чтобы ее можно было вызывать даже когда нету ни одного объекта и чтобы соблюдать правила инкапсуляции
	// Статические методы могут работать только со статическими данными класса.
	template<typename T> static Animal* CreateAnimal(short h) {
		std::cout << "Animal::Create" << std::endl;
		population++; // Увеличиваем популяцию на один
		return new T(h);
	}

	static int population; // Статическая переменная - сущетсвует вне объектов, фиксирует общее количество животных
};


// Класс животного КАБАН
class WildBoar : public Animal {
public:
	WildBoar(short h);
	virtual Animal* Create(); // Может производить сородичей
};


// Клас животного ВОЛК
class Wolf : public Animal {
public:
	Wolf(short h);
	virtual Animal* Create(); // Также может производить сородичей
};

#endif
class.cpp
#include "class.h"

// Конструктор класса Animal вызывается в конструкторах других реальных классов
Animal::Animal(short h) :
maxHealth(h)
{ };

WildBoar::WildBoar(short h) :
Animal(h) // Вот тут вызываем конструктор базового класса
{ }

Animal* WildBoar::Create() {
	std::cout << "WildBoar::Create" << std::endl;
	CreateAnimal<WildBoar>(100); // Передаем тип вместе с количеством HP
}

Wolf::Wolf(short h) :
Animal(h)
{ }

Animal* Wolf::Create() {
	std::cout << "Wolf::Create" << std::endl;
	CreateAnimal<Wolf>(50);
}
main.cpp
#include "class.h"

// population статическая переменная а значит она уже создана.
// Нужно указать компилятору что она в другой единице трансляции чтобы ее использовать тут.
extern int Animal::population; 

int main() {

	// Инициализируем 
	Animal::population = 0;
	
	// Тут еще 0
	std::cout << Animal::population << std::endl;
	
	// Можно создать указатели на любого животного и создать их через статическую функцию
	Animal* wb = Animal::CreateAnimal<WildBoar>(100);
	Animal* wf     = Animal::CreateAnimal<Wolf>(50);
	
	// Теперь их двое
	std::cout << Animal::population << std::endl;
	
	// Животные могут сами себя производить - каждый свой тип (если не указано иное в методах Create)
	wb->Create();
	wf->Create();
	
	// Теперь их четверо
	std::cout << Animal::population << std::endl;
	
	return 0;
}
Насчет ошибки из первого поста вероятней всего компоновщику не указан объектный файл с методами класса.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Samodelkin за это полезное сообщение:
pax (18.12.2010), Reizel (18.12.2010)
Старый 18.12.2010, 13:15   #23
jimon
 
Сообщений: n/a
Ответ: Undefined reference to...

не забываем о виртуальном деструкторе в class Animal, а то потом кучу геморроя заимеем

ps. для скорости я убираю virtual в методах которые мне явно не понадобится переопределять, а virtual ... = 0 находится только в декларациях методов интерфейса
те так :
class WildBoar : public Animal {
public:
	WildBoar(short h);
	Animal* Create(); // Может производить сородичей
};
теперь если мы вызываем вот это :
Animal * foo = new WildBoar;
...
foo->Create();
то во второй строчке произойдет обращение к виртуальной таблице методов, и вызов метода по смещению от туда

но если написать так :
Animal * foo = new WildBoar;
...
WildBoar * bar = static_cast<WildBoar*>(foo); // мы уверенны на все 100% что это WildBoar
bar->Create();
то вызов bar->Create(); выполнится напрямую, смещение метода посчитается во время компиляции и не будет никаких тормозов

хочу заметить что в данном случае нет никакого RTTI, и его использовать тоже не стоит (так же как и try...catch), в геймдеве рискуют статическим методом предоставления безопасности кода, а пользуются здравым смыслом
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо за это полезное сообщение:
falcon (18.12.2010), HolyDel (19.12.2010), pax (18.12.2010), Samodelkin (18.12.2010)
Старый 18.12.2010, 15:50   #24
falcon
Разработчик
 
Аватар для falcon
 
Регистрация: 12.07.2008
Сообщений: 523
Написано 196 полезных сообщений
(для 470 пользователей)
Ответ: Undefined reference to...

Эх, что-то последнее время наша "элита" С++ программистов любит только издеваться над начинающими. Практически не помню нормальных ответов... к сожалению.
У вас, уважаемый, паранойя уже.
Элита стебётся? Так и надо т.к. C++ не терпит идиотов.
На подобные вопросы ответы лежат в литературе, которую должно быть не лень читать. Если человек через 10 минут после прочтения книги не может написать примитивный код, то ему либо надо перечитать всё заново и повнимательнее, либо он идиот, и лучше пускай забудет об этом языке.

Такое ощущение будто фразы типа "жаль что перестали помогать", "булкостайл" и т.п. - просто какая-то новая фишка. Фразы на все времена.
Очнитесь блин. Элите НЕ ИНТЕРЕСНО отвечать на тупые вопросы. Это пустая трата времени. Вменяемый новичок должен сам учиться искать ответы на тривиальные вопросы. И это НОРМАЛЬНО. Вменяемых новичков это стимулирует учиться искать ответы самим, а невменяемых отсеивает от сферы деятельности. Так и должно быть.
http://segfault.kiev.ua/smart-questions-ru.html
(Offline)
 
Ответить с цитированием
Старый 18.12.2010, 16:13   #25
Nuprahtor
Элита
 
Аватар для Nuprahtor
 
Регистрация: 26.07.2008
Сообщений: 1,972
Написано 1,095 полезных сообщений
(для 3,923 пользователей)
Ответ: Undefined reference to...

Человек, не знающий C++ - идиот
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо Nuprahtor за это полезное сообщение:
Dream (20.12.2010), pepel (04.01.2011), SBJoker (18.12.2010), Жека (19.12.2010)
Старый 18.12.2010, 18:46   #26
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Ответ: Undefined reference to...

Идиот, ты тупой, какое отношение имеешь ты к с++ ??
Зы: Достоевский Ф. М. - "Идиот" !!
(Offline)
 
Ответить с цитированием
Старый 18.12.2010, 19:03   #27
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Undefined reference to...

Сообщение от falcon Посмотреть сообщение
Элите НЕ ИНТЕРЕСНО отвечать на тупые вопросы.
Элите интересно стебаться над всеми начинающими. Да, я это уже понял. Спасибо, что напомнил.

PS: Возможно я не точно воспроизведу сказанную нашим админом когда-то фразу: "Если я не смогу передать свои знания другим, то тогда какой от них смысл?". Я придерживаюсь того-же мнения.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
falcon (18.12.2010), Nuprahtor (18.12.2010), pepel (04.01.2011), St_AnGer (18.12.2010)
Старый 18.12.2010, 21:24   #28
falcon
Разработчик
 
Аватар для falcon
 
Регистрация: 12.07.2008
Сообщений: 523
Написано 196 полезных сообщений
(для 470 пользователей)
Ответ: Undefined reference to...


Я придерживаюсь того-же мнения.
да ради бога! )
я лично тоже категорически поддерживаю это мнение!
Но у тебя (на мой взгляд) это мнение исказилось и превратилось в паранойю.
Передавать свои знания - нужно, да. Но это занятие должно быть полезным. От того, что на новичок получит ответ на очень тривиальный вопрос, пользы не получит ни спрашивающий, ни отвечающий.
Это равносильно просьбы кода, ради копипасты.
На тривиальные вопросы новичок должен находить ответы сам. Находить в литературе или в гугле.
Когда тебя спрашивают "почему компилятор ругается, когда я объявляю массив размером i (где i не const)"
намного лучше послать его читать книжки, в которых авторы намного лучше тебя ответили на этот вопрос, нежели предоставить пример с выделением динамической памяти..
глядишь спрашивающий ещё чего-нибудь полезного из книжки выцепит.
Зря что ли Страуструп, Эккель, Либерти и другие авторы книжки писали?
(Offline)
 
Ответить с цитированием
Старый 18.12.2010, 21:49   #29
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Undefined reference to...

Сообщение от falcon Посмотреть сообщение
Но у тебя (на мой взгляд) это мнение исказилось и превратилось в паранойю.
Ты никогда не спрашивал у себя в институте у преподавателей - почему они терпят то, что больше половины аудитории их не слушает?
И наверное не думал, что форум является так же учебным пособием, которое новичок возьмет и прочитает и потом вопроса не задаст?

UPD: Посылая новичка гуглить куда он попадает? На такие же форумы.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Reizel (20.12.2010), Жека (19.12.2010)
Старый 18.12.2010, 23:15   #30
falcon
Разработчик
 
Аватар для falcon
 
Регистрация: 12.07.2008
Сообщений: 523
Написано 196 полезных сообщений
(для 470 пользователей)
Ответ: Undefined reference to...


почему они терпят то, что больше половины аудитории их не слушает?
им за это платят.
терпеть ничего не надо.
слушают или нет преподавателя вообще не волнует.

Посылая новичка гуглить куда он попадает? На такие же форумы.
какой запрос должен вбить новичок в гугль, что бы узнать как решить проблему аналогичную проблеме Павла?
Что я натворил не так, исправьте меня лучше щас, а то дальше будет хуже
??

pax, вроде взрослый дядя. Зачем цепляешься к отдельным фразам из текста?
я пытался донести то, что на тривиальные вопросы нужно учиться искать ответы самому. Лучше в литературе. Не менее взрослые и умные дяди свои знания через книжки передают.
На форумах можно увидеть обсуждение какой-либо проблемы. Полезно гуглить, что бы узнать мнения профессионалов касательно какой-то проблемы (с неоднозначным решением). Узнать взгляды на различные методы реализации чего-либо, почитать обсуждение какого-либо метода.

может есть резон обсудить это отдельно?)
в аське, или хотя бы в другом разделе?)
или тема битая, и лучше прекратить флуд, оставшись при своём мнении?
to Randomize

вот уж не надо ><
беда в том, что C++ не из тех языков, на которых можно сесть и тупо начать писать, без понимания "как это работает".
У нас в инсте одну дисциплину ведёт молодой прогер Java. Достаточно опытный такой прогер (для своего возраста), авторитетный.. в проектах серьёзных участвует. Да вот спросил я его, по поводу динамического и статического полиморфизма.. А он и знать не знает, что это. Видать сидя на Java можно мало чего знать, но при этом добавиться отличных оптимальных результатов.
К C++ подход другой нужен. Тонна литературы, много практики.. Очень полезна профессиональная практика, что бы кто-то инспектировал код, что бы знать, как организуются настоящие проекты. Этот язык так многогранен, что изучать его можно очень долгое время..
Хорошей информации по языку и библиотеке - тонны. Просто язык не по статьям учить нужно...
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 03:49.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com