forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Классы (http://forum.boolean.name/showthread.php?t=15398)

Mind 31.08.2011 20:37

Классы
 
Пирешел на классы вместо структур.Вроде все получаеться но компилятор ругаеться вот на такую вещь:
Код:

class Camera
{
public:
...
...
...
}

class Object
{
public:
...
...
...
}

void MovedCamera(Camera& CAMERA);
void CollisionsObjToCam(Object& MODEL,Camera& CAMERA);

Цитата:

void MovedCamera(Camera& CAMERA);
void CollisionsObjToCam(Object& MODEL,Camera& CAMERA);

Ругаеться на эти строки что идентификатор неопределен.

А когда так:

Код:

class Camera
{
public:
...
...
...
}

void MovedCamera(Camera& CAMERA);

class Object
{
public:
...
...
...
}


void CollisionsObjToCam(Object& MODEL,Camera& CAMERA);

то только на эту:
Цитата:

void CollisionsObjToCam(Object& MODEL,Camera& CAMERA);
Что мои кривые руки сделали не так? :4to:

Извиняюсь понял ошибку.
Мои кривые руки оказываеться создавали прототип прямо в классе(он такой большой что я не заметил его конец и создал прототп в нём :-D )

moka 31.08.2011 21:07

Ответ: Классы
 
Ещё пометка, относительно имёнований. Классы и функции - Ок, используется BumpyCase (каждое слово с заглавное), но вот имена параметров в функциях, все заглавные, а это сильно сбивает.
Самое распространённое это использовать camelCase (когда все кроме первого слова, с заглавной). Это помогает определить тип субъекта при чтении.
Все заглавные, используются для констант (статичные значения, объявленные при компиляции).

Так пометка..

Mind 31.08.2011 21:22

Ответ: Классы
 
Ясно спасибо.Когдато раньше читл про Венгерскую систепу писания/кодинга уже подзабыл :)

Mr_F_ 31.08.2011 22:07

Ответ: Классы
 
Цитата:

Ясно спасибо.Когдато раньше читл про Венгерскую систепу писания/кодинга уже подзабыл
я против венгерской.
согласен с этим чуваком:
http://insidecpp.ru/art/23/

Цитата:

camelCase
люблю так делать для переменных.
Но функции почему-то люблю когда с большой (ностальгия по блицу?).

den 31.08.2011 22:23

Ответ: Классы
 
Я тоже против. Только делаю одно исключение: в начале имён интерфейсов ставлю I.
IWindow напиример.

HolyDel 31.08.2011 22:33

Ответ: Классы
 
Цитата:

Только делаю одно исключение: в начале имён интерфейсов ставлю I.
а я не ставлю
пользователю все равно отдаются только интерфейсы. а чо там в реализации внутри либки как то пофигу.

falcon 01.09.2011 00:37

Ответ: Классы
 
Цитата:

Mr_F_ я против венгерской.
а ты когда нибудь копашился в огромном (действительно крупном) проекте, с тысячями и тысячами(!) файлов исходников на несколько гигов, с огромными классами, где каждая функция размером не меньше полэкрана, а в среднем с экран?
Не в графических движках или игре, устройство которых скорее всего (ну я надеюсь) ты как то понимаешь, а в том коде, работу которого ты понимаешь лишь отдалённо?
И не факт что ты проработаешь с этим кодом всю жизнь. Возможно тебя переведут в другой проект (и вполне возможно, что он окажется крупней и опять никак не связан с тем что ты более или менее знаешь). И времени изучать досконально как там всё НА САМОМ ДЕЛЕ работает ну просто не может быть.
Тебе дали задачу и сказали, что вся документация - код.
А когда функция разворачивается на экран, и не факт что именно она корень зла, да ещё и код написан по индусячьи, а задачу надо как то решить, без "вшитых" в имена данных обойтись становится на порядок сложнее. Разобрать откуда взялся тут этот указатель, инстантули его через какой то синглтон, передали в параметре, или он вообще член класса - пойди разбери если это было хрен пойми где сделано.
По поводу "плохой архитектуры" всё вода. Нельзя идеально спроектировать систему. Да даже идеальная система разрастаясь становится трудно читабельной.
Настоящая разработка ПО сильно отличается от домашней кухни. Все эти академические красоты, однозначности и мечты об идеальной архитектуре оче быстро накрываются, а примитивные префиксы обретают особую роль, когда одним мимолётным взглядом на переменную можно определить относится ли она к тому, что ты ищещ.
А все эти ошибки, которые может допустить кодер, случайно не так обозвав переменную, быстро детектятся на ревью.

.Squid 01.09.2011 01:04

Ответ: Классы
 
Цитата:

Сообщение от falcon (Сообщение 200780)
огромными классами

Цитата:

Сообщение от falcon (Сообщение 200780)
каждая функция размером не меньше полэкрана, а в среднем с экран

Цитата:

Сообщение от falcon (Сообщение 200780)
вся документация - код.

Цитата:

Сообщение от falcon (Сообщение 200780)
код написан по индусячьи

Такие ошибки не через год всплывают, они накапливаются как снежный ком с самого начала. Лид программер за зря получает повышенную з/п, если не может заставить подчиненных писать нормальный код. Венгерской нотацией тут не можешь и нельзя было помочь. Изначально все пошло не так.

Mr_F_ 01.09.2011 01:14

Ответ: Классы
 
я бы не стал уж точно доверять названиям переменных, если код вышеописанный. я бы все равно проверял какой у них на самом деле тип, иначе был бы не застрахован.

ISergey 01.09.2011 01:18

Ответ: Классы
 
Цитата:

а ты когда нибудь копашился в огромном (действительно крупном) проекте, с тысячями и тысячами(!) файлов исходников на несколько гигов, с огромными классами, где каждая функция размером не меньше полэкрана, а в среднем с экран?
Может не будем преувеличивать...

falcon 01.09.2011 11:11

Ответ: Классы
 
Цитата:

Может не будем преувеличивать...
это не преувеличение, а вполне рядовая работа.

Цитата:

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

Цитата:

Такие ошибки не через год всплывают, они накапливаются как снежный ком с самого начала. Лид программер за зря получает повышенную з/п, если не может заставить подчиненных писать нормальный код. Венгерской нотацией тут не можешь и нельзя была помочь. Изначально все пошло не так.
так и есть. Ошибки всплывают сразу, и фиксятся по мере поступления. Тим лиды тут правда мало виноваты. Проект не всегда ведётся одной командой с добросовесным лидом. Тут проблема скорее менеджмента. Какой-то мудак решил сэкономить отдав код индуской организации, которая сделает быстро и дёшево. Естетсвенно у тех нету времени, кадров и квалификации для качественного ревью (в моём проекте не смотря на строгий гайдлайн, куда не плюнь видны нарушения..).
Тем не менее с этим ПРИХОДИТСЯ работать. Менеджер не понял, что отдать индусам проект - ложная экономия (ибо потом придётся потратить в трое больше времени на багофикс), но повлиять на это рядовой програмер никак не может и результат остаётся исключительно на совести управляющего.
Потому всякие мелочи в нотации действительно очень помогают. Да, им нb в коем случае нельзя всецело доверять, но тем не менее они становятся главным ориентиром при первичном анализе кода. Даже если при именовании кто-то ошибся, во всех остальных местах шансы разобраться в коде значительно повышаются.

.Squid 01.09.2011 12:59

Ответ: Классы
 
Я не понимаю. Ты хочешь сказать, что не смотря на всю задницу, в которую превратился код, венгерская нотация делает ее приятнее? Ок.

falcon 01.09.2011 13:44

Ответ: Классы
 
Цитата:

Я не понимаю. Ты хочешь сказать, что не смотря на всю задницу, в которую превратился код, венгерская нотация делает ее приятнее? Ок.
именно
если б в нотации не было подсказок какое говно из какого выростает, разобраться в этом всё было бы на порядок сложнее.
Сама по себе нотация код хуже НЕ ДЕЛАЕТ.

moka 01.09.2011 13:58

Ответ: Классы
 
Даже MS открыто говорят о непригодности венгерской нотации в современном коде.

Я лично, нигде в нормальных компаниях не встречал этого. Было пару раз лишь, одна была - индусский оутсорс, да и там больше инженеры (микроконтроллеров) писали код, а они это делали то как их там учили, а это было давно. Другой раз, какой-то самоучка, с ним было тяжело общаться вообще, само убеждённый и наивный..

В том же классе, придерживаюсь таких правил:
1. camelCase - для всех переменных, локальных, параметров, мемберов (никаких _ вначале).
2. BumpyCase - для наименований классов, объеденений, методов, аксессоров. Это помогает иметь например приватный фиелд в классе "name" и аксессор к нему "Name". Удобно и читаемо.
3. Если обращаюсь к фиелдам экземпляра класса, то всегда использу "this." вначале. Угу, кто-то подумает много читать, но я предлагал данную коррекцию в написании многих разрабов, и показывал примеры, 90% соглашались, и в итоге также задумывались об использовании. Дело в том чтобы чётко разделить границу между именно локальными переменами и теми что являются фиелдами класса. В Венгерской Нотации, это решалось "_" в начале локальной переменной. Но это имхо некрасиво, да и читабельность страдает. А с хорошей подсветкой "this." - выглядит куда информативнее.
Зачем? А затем что в метод можно передать параметр: BlaBla(string name) {, учитывая что и фиелд класса которому принадлежит метод, может иметь то же самое имя "name", и чтобы не напортачить, всегда обращаемся через this. или без. Это сразу отделяет эти две переменные с одним именем.

.Squid +1, насчёт "убер функций" и т.п., что это проблема самой организации работы и философии.
Что тут сказать, если нада с таким работать, то мне вас лично жалко, т.к. это ужас с таким работать.
Класс должен делать только свою работу, а методы маленькими и выполнять конкретную задачу, а не кучу процессов, где как раз и заключается проблема.
Код с функциями во весь экран - есть зло.

Цитата:

Сама по себе нотация код хуже НЕ ДЕЛАЕТ.
Это как посмотреть, качество кода определяется по разным факторам, и одним из них являются правила написания кода, следственно влияет.

den 01.09.2011 14:03

Ответ: Классы
 
Цитата:

Сама по себе нотация код хуже НЕ ДЕЛАЕТ.
но и лучше тоже.

falcon 01.09.2011 14:29

Ответ: Классы
 
Цитата:

но и лучше тоже.
да што ты говоришь.
посмотрю как ты в объёмном чужом коде ковыряться будешь, не зная, что откуда берётся.

Цитата:

.Squid +1, насчёт "убер функций" и т.п., что это проблема самой организации работы и философии.
в зду твою философию)))
Этот этап пройден несколько лет назад. Сейчас с этим кодом можно только работать.
Код УЖЕ написан, и его никто не будет переписывать. Можно сколько угодно говорить о его не совершенстве, но отсутствие венгерской нотации в таком уже написанном коде усложнила бы работу на порядок.

Цитата:

Класс должен
выполнять конкретную задачу
Код с функциями во весь экран - есть зло.
НЕТ идеальных архитектур. НЕТ идеального кода.
Академическое мышление, что чему должно и кто кому чем обязан малоценны в ентерпрайзе. Решение далеко не всегда оказывается самым эффективным, а перерешивать никто и ничего не будет.
Алсо классы и функции выполняют весьма себе определённые задачи. Просто задачи эти весьма объёмны.

Есть такой замечательный дядька - Джоэл.
В его книге о программировании очень не плохо расписана ситуация по поводу совершенства кода:

Пишет программист код. Внезапно у очень многих появляется непреодолимое желание взять и переписать. Начать всё заного, сделать всё чище и лучше. Почему? Да потому что код заполонили всякие костыли, фиксы, да и вообще он стал громозким и запутанным.
Но переписывать такое НЕЛЬЗЯ НИ В КОЕМ СЛУЧАЕ.
почему? Потому что на этот код потрачено много сил и средств. Он уже отлажен и работает. И вся его громозкость - результат фиксов багов, добавления функционала ВНЕЗАПНО потребовавшегося заказчику и т.п.
Именно так ф-ции, классы и решения различных задачь и разростаются со временем.
Создать грамотную архитектуру с нуля не возможно. Так или иначе всегда придётся вносить коректироки.
В данном случае венгерская нотация позволяет максимально эффективно находить деффекты и вносить коректировки.
то что МОГЛИ БЫТЬ маленькие ф-ции, самодокументируемый код, куча однозначных спецификаций и ответственных руководителей - это бесспорно. А ещё каждый обидатель этого форума МОГ БЫ БЫТЬ миллиордером. Все эти "могло бы, должно, обязано" - фигня. Оно уже есть, оно работает и в этом надо разбираться. И венгерская нотация позволяет разбираться быстрее и эффективней.
И каждый раз, когда берёшься за проект, не можешь быть уверен, что он не разрастётся, не зальётся говнокодом и тупыми индускими конструкциями. Потому внесение таких нотационных подсказок весьма не плохое решение.

P.S. соре за объём.. на работе делать нех, пока рабочий девайс не прокачают...

Mr_F_ 01.09.2011 14:37

Ответ: Классы
 
Цитата:

Создать грамотную архитектуру с нуля не возможно.
согласен с этим.
Цитата:

Начать всё заного, сделать всё чище и лучше. Почему? Да потому что код заполонили всякие костыли, фиксы, да и вообще он стал громозким и запутанным.
Но переписывать такое НЕЛЬЗЯ НИ В КОЕМ СЛУЧАЕ.
а с этим нет.
когда я писал свой первый двиг и его заполнили костыли, фиксы и он стал громоздким и запутанным, я написал новый с нуля, и это очень даже окупилось. я просто понял все ошибки прошлого кода и постарался написать без них. я понимаю если проект, использующий код, подходит к концу - тогда можно добавлять костыли, это будет дешевле. в ином случае надо срочно всё переписывать, иначе эксплуатация кода будет каждодневной пыткой.

moka 01.09.2011 14:51

Ответ: Классы
 
С расчётом на будущее использование - рефакторинг, один из отличных процессов, который несёт кучу профита для самого разработчика и продукта. Это делать нужно с умом, т.к. порой большое убер-бревно вот так не перепишешь, поэтому рефакторинг не простая задача, которая требует подхода.

А то что академические подходы не выживают в коммерции - с этим согласен. Только дополню: в школе, вас учат, и учитесь вы базируясь разным источникам, но не важнейшему - опыту. А лучший опыт, это коммерческий опыт.
Ты говоришь о проектах, с которыми тебе приходится работать, но они уже есть. Это не оправдание что так нужно теперь делать всё. Двигаться нужно вперёд, а не засиживаться на одном месте.
Да, в твоём случае, венгерская нотация, помогла бы, но это не оправдывает её. Т.к. она помогла бы для разбора ужасного кода. Получается что она применима для ужасного кода, и помогает там.
В хорошем и слаженном коде, таких проблем не возникает.

Другой момент, это "философия" и организация работ. И несмотря на твой комент "в зду..", ты потом как раз затрагиваешь эти моменты:
Цитата:

И вся его громозкость - результат фиксов багов, добавления функционала ВНЕЗАПНО потребовавшегося заказчику и т.п.
Проблема организации проекта. Такого не должно быть. Также, разработка кода с учётом его модульности и возможностей, никак не пострадает от "внезапных запросов", т.к. клиент не попросит писать конкретно вот такие строки, он лишь запросит клёвую фичу, которая потребует лишь дополнительную разработку на уровне бизнес логики, или даже фронт-енда, а это не влияет на сами классы никак, если они разработаны с умом..

Тут уже разговор перетекает в организацию проектов, и лид девелоперов, командную работу..

den 01.09.2011 15:03

Ответ: Классы
 
Цитата:

посмотрю как ты в объёмном чужом коде ковыряться будешь, не зная, что откуда берётся.
в нормально IDE если навести на переменую мышкой, появится подсказка, чем является данная переменная.

falcon 01.09.2011 15:12

Ответ: Классы
 
Цитата:

а с этим нет.
ну если ты высказался против венгерской нотации как таковой, так не приводи в пример только свои небольшие наработки))
лично я сам свой движок переписывал, переписываю и ещё раз перепишу :D
но это потому, что я никому не обязан сдавать его. И потому что он сравнительно крохотный по объёму.
Когда разрабатываешь продукт для заказчика, и понимаешь что изначально сделал что то не так, придётся допиливать то, что есть. а вот В СЛЕДУЮЩИЙ РАЗ взявшись за такое, ты уже будешь знать как подойти грамотней. Так люди и качаются.
Вот только вне домашней кухни выбрасывать продукт и начинать заного - верх идиотизма.
Цитата:

С расчётом на будущее использование - рефакторинг
миня тут никто не слушает, и ничего рефакторить не собирается :(
я отчасти с командой конечно согласен.. быстрее б просто уже выпустить это всё г-но, и отделаться..

>>Проблема организации проекта.
это ПОФИГ. Ещё раз повторяю - оно УЖЕ организовано.
>>В хорошем и слаженном коде, таких проблем не возникает.
хороший код в энтерпрайзе - утопия.
нельзя заранее знать насколько удачной выйдет огромная система.
в определённый момент она запрасто может "поплыть", и превратиться в кашмар. Венгерская нотация МОЖЕТ пригодится если код свалится в унылое говно, потому отказываться от неё - весьма и весьма самоуверенно.
Цитата:

Такого не должно быть
если они разработаны с умом..
опять эти "должно" и "если".
венгерская нотация просто крутая страховка, на случай если система разработана неудачно. И быть её противником, оче не правильно.

moka 01.09.2011 15:13

Ответ: Классы
 
Цитата:

Сообщение от Den (Сообщение 200831)
в нормально IDE если навести на переменую мышкой, появится подсказка, чем является данная переменная.

Далее можно нажать F12 (почти во всех VS), отправит туда где объявлена переменная, функция, класс и т.п. Также есть удобные инструменты такие как Object Viewer или удобный поиск. Есть функции для глобального переименования переменной (F2 в VS). Авто генерируемая документация о функциях.
Да куча всего. Другое дело тут пойдёт уже речь о более сложных процессах, со всякими темплейтами, рефлекциями и т.п. Там вот уже без знаний и разного рода исследований по коду будет тяжко. Особенно в рефлекции..

falcon 01.09.2011 15:32

Ответ: Классы
 
Я для себя открыл такую крутую штуку как Source Insight :)
но этого всего на самом деле не достаточно.

impersonalis 01.09.2011 15:37

Ответ: Классы
 
*взял попкорн*

NitE 01.09.2011 20:07

Ответ: Классы
 
falcon, так что, не будешь голословным, или пруфа не ждать ?

Проект с несколькими тысячами файлов исходников(минимум 2к) и весом в несколько гигов (минимум 2) на стол !

falcon 01.09.2011 22:08

Ответ: Классы
 
NitE, ам.. ну да, как раз думал, чоб в свободный доступ исходники не выложить :D
ваще-то я NDA подписывал))

могу минимально нарушить, рассказав, что работаю с SIP телефонами компании Avaya (т.е. по сути эти объёмные исходники компилятся в небольшую бинарку, которая крутится под жутко кастрированным и допиленным линухом встроенным в эти самые агрегаты )
но это врядли удовлетворит твоё NitE любопытство.
Можешь засчитать это как слив, но исходники я тебе не предоставлю))

HolyDel 01.09.2011 22:18

Ответ: Классы
 
Цитата:

когда я писал свой первый двиг и его заполнили костыли, фиксы и он стал громоздким и запутанным, я написал новый с нуля, и это очень даже окупилось. я просто понял все ошибки прошлого кода и постарался написать без них. я понимаю если проект, использующий код, подходит к концу - тогда можно добавлять костыли, это будет дешевле. в ином случае надо срочно всё переписывать, иначе эксплуатация кода будет каждодневной пыткой.
брат!

NitE 01.09.2011 22:34

Ответ: Классы
 
falcon, ))) мне не нужны исходники, достаточно будет скриншота с замазанными именами файлов, если надо, и открытым пропертисом где видно коль-во файлов и суммарный вес. И чтоб без читерства !

moka 01.09.2011 22:37

Ответ: Классы
 
NDA.. - он уже его нарушил, так ещё я бы не советовал.

falcon 01.09.2011 22:41

Ответ: Классы
 
Как то это глупо что ли.
Если это чото значит, окей, в понедельник всё будет :)

MoKa
ну блин, это же ТАК ВАЖНО чо..)))
МОЙ рабочий проект ЕСТЕСТВЕННО имеет решающее значение в венгерской нотации))

Mind 04.09.2011 11:50

Ответ: Классы
 
У меня вопрос:
Если в функцию я передаю по ссылке класс, чтобы осуществить линейное преобразование(передвижение),хотя можно было бы обойтись ссылкой на матрицу.Сильно ли я теряю в производительности?

.Squid 04.09.2011 14:14

Ответ: Классы
 
Если ты в функции просто обращаешься к матрице, хранимой в классе, то нет.

Mind 04.09.2011 19:11

Ответ: Классы
 
Цитата:

Если ты в функции просто обращаешься к матрице, хранимой в классе, то нет.
Код:

class CCamera
{
public:
D3DXMATRIX matView,matProj,matViewPos,matViewRX,matViewRY,matViewRZ;
float x,y,z,rx,ry,rz;
...
...
}
void MoveEntity(CCamera& camera,float dx,float dy,float dz)
{
camera.matViewPos._41 += dx;
camera.matViewPos._42 += dy;
camera.matViewPos._43 += dz;
}

...
...

MoveEntity(cam,0,0,3);

...
...


Я так понял в таком варианте я в производительности не сильно теряю.Да?

Mr_F_ 04.09.2011 19:24

Ответ: Классы
 
вообще не теряешь

moka 05.09.2011 13:44

Ответ: Классы
 
Ты передаёшь ссылку на класс, получение из ссылки (Handle <> Object), сам handle класса, и дальнейшая работа с ним - имхо ок.

Проверь очень просто, сделай две такие функции. И затем в цикле запусти каждую 1000 раз, и замерь.

falcon 05.09.2011 21:36

Ответ: Классы
 

собсно SIP 6.2 весь проект
я работаю конкретно с application (UI всякие, визуализация ядерных возможностей).. пока что)

только как это влияет на "голословность" и даже если как то влияет, какое это отношение имеет к венгерской нотации?

ну а эту красоту я просто не могу не продемонстрировать))



HolyDel 08.09.2011 22:35

Ответ: Классы
 
похоже на временное решение. видимо в default что то адово

falcon 09.09.2011 00:57

Ответ: Классы
 
не временное!!1)
оно полностью соответствует спеке..
тут логика в чом.. некоторые пункты меню (лайны) должны иметь один и тот же тайтл на скрине. Конкретно, первые два кейса. Третий кейс тут ваще просто так затесался, а ABOUT имеет другой, позже жоско выставленый тайтл.. По факту, то что увидит юзерь действительно соответсвует данным в спецификации.. но достигнуто это было через жопу)

HolyDel 09.09.2011 02:38

Ответ: Классы
 
Цитата:

ABOUT имеет друго
судя по коду первые четыре метки выполнят одно и то же, не?

falcon 09.09.2011 11:27

Ответ: Классы
 
Лучше этот код не судить)
нет, третья метка - пункт другого меню с другим тайтлом, и нах она сюда затесалась - загадка.
четвёртый пункт тоже потом(!) меняется ибо имеет другой тайтл (хотя не мало вероятно, что это результат фикса какого нито.. типа сначала 4 этих метки имели один и тот же тайтл, а потом что-то пошло не так.. но это ж не значит что фикс должен иметь подобный вид? Да вот В ЛЮБОМ СЛУЧАЕ подобное "падение" по кейсам должно годно документироваться в коментах..)

ANIK123 07.10.2011 23:26

Ответ: Классы
 
Привет всем и вся)
Хочу задать наверн туповатый вопрос: ПОЧЕМУ?!? (ответ "кривые руки" не принимается ибо сам об этом знаю)

Вот часть класса:
Код:

class cCamera
{
public:       
        cCamera();
        Handle getCamp();
        Handle getCamera();
private:
        Handle camp;
        Handle camera;
};

cCamera::cCamera(){
        camp = xCreateCube();
        camera = xCreateCamera(camp);
        бла-бла-бла
}

Handle cCamera::getCamp(){
        Handle *tmp=&camp;
        return *tmp;
}

Handle cCamera::getCamera(){
        Handle *tmp=&camera;
        return *tmp;
}

Вот часть кода:
PHP код:

cCamera cam();
cPlayer player("../models/player.fbx",cam.getCamera());
xMoveEntity(cam.getCamp(),0,0,0.1f); 

И собсно ошибки:
Код:

error C2228: выражение слева от ".getCamera" должно представлять класс, структуру или объединение
error C2228: выражение слева от ".getCamp" должно представлять класс, структуру или объединение

Чяднт?

Заранее спасибо народ)

Mr_F_ 07.10.2011 23:39

Ответ: Классы
 
в часть кода не заинклужен хидер с классом?

ANIK123 08.10.2011 00:03

Ответ: Классы
 
Другой класс из этого же хедера работает :/
Короче вот и сам "проЭкт"( см ссылку )) Поясните идиоту плиз в чем проблемма)))
http://files.mail.ru/VAJCHT

Mr_F_ 08.10.2011 00:15

Ответ: Классы
 
студия старая у меня, не открою все равно.
ща ещё заметил - у тебя объявление класса камеры заканчивается }, а точки с запятой нету после этой скобочки.

ANIK123 08.10.2011 00:24

Ответ: Классы
 
Да нет, есть:
Код:

class cCamera
{
public:
        Handle camp;
        Handle camera;
       
        cCamera();
        Handle getCamp();
        Handle getCamera();
private:
};

O_O

Цитата:

студия старая у меня, не открою все равно.
А копи-паст?)
зы: Извини но Я никак не врубаюсь в природу этой ошибки(

pax 08.10.2011 01:14

Ответ: Классы
 
А такое объявление это сокращенная запись конструктора?
PHP код:

cCamera cam(); 

Чет я забыл синтаксис С++...
Похоже на предварительное объявление функции с названием cam

попробуй так:
PHP код:

cCamera cam = new cCamera(); 


ANIK123 08.10.2011 03:09

Ответ: Классы
 
спасибо pax, но не работает(
см остальной код - обявление player такое же как и cam
а с player проблем нету
Цитата:

А такое объявление это сокращенная запись конструктора?
Не понимаю о чем ты - просто обявляю обьект cam класса cCamera с пользовательским конструктором который не требует аргументов

ЗЫ: Если честно - с player была та же проблема что сейчас с cam, но Я был жутко сонный - проблему решил - но нифига не помню КАК(!?!)
:crazy:
Что за фигня? О_О_О_О

pax 08.10.2011 12:19

Ответ: Классы
 
Вроде скомпилилось
PHP код:

#include "xors3d.h"
#include <iostream>
#include <math.h>
#include "aw_def.h"

int APIENTRY WinMain(HINSTANCE instanceHINSTANCE prevInstanceLPSTR commandLineint commandShow)
{

// set graphics mode
    
xGraphics3D(144090032,true,true);
    
xAppTitle("DATAR");

    
cCameracam = new cCamera();

    
//xAntiAlias(true);
    
    
int light xCreateLight();
    
//xLightColor(light,255,0,0);
    
xLightRange(light,7);
    
xRotateEntity(light,50,-30,0);
    
    
Handle camHandle cam->getCamera();

    
cPlayer *player = new cPlayer("../models/player.fbx"camHandle);

    
int terra xLoadMesh("../models/Terrain.b3d");
    
xScaleEntity(terra,3,1,3);
    
xTerrainShading(terra,true);
    
xEntityPickMode(terra,2);
    
xPositionEntity(terra,0,0,32);
    
int basetex xLoadTexture("../textures/bumped_sand2.jpg");
    
xEntityTexture(terra,basetex);
    
xScaleTexture(basetex,0.1f,0.1f);

    
//xAnimate(player,3,1,1);

        
while(!xKeyDown(KEY_ESCAPE))
    {
        
xMoveEntity(cam->getCamp(),0,0,0.1f); xMoveEntity(player->getModel(),0,0,0.1f);
        
//xPositionEntity(camp,xEntityX(player.getModel()),xEntityY(player.getModel()),xEntityZ(player.getModel()));

        // render scene
        
xUpdateWorld();
        
xRenderWorld();
        
player->Gear();
        
player->debug();
        
// draw scene
        
xFlip();
        }
    return 
0;



ANIK123 08.10.2011 18:06

Ответ: Классы
 
ммм...
запихать все в динамическую память хороший вариант - в данном случае - наверное единственный выход)
спасибо pax!
Но мне все же интерессно - в чем проблема? Наверное это останется ужасной тайной)))
В любом случае спасибо всем кто откликнулся)

dsd 09.10.2011 01:45

Ответ: Классы
 
"cCamera cam();
cPlayer player("../models/player.fbx",cam.getCamera());
xMoveEntity(cam.getCamp(),0,0,0.1f); "
Может в этих скобочках проблема? Зачем они?

impersonalis 09.10.2011 02:20

Ответ: Классы
 
Цитата:

Сообщение от dsd (Сообщение 205169)
"cCamera cam();
cPlayer player("../models/player.fbx",cam.getCamera());
xMoveEntity(cam.getCamp(),0,0,0.1f); "
Может в этих скобочках проблема? Зачем они?

ненужны вроде. :rolleyes:

moka 09.10.2011 02:49

Ответ: Классы
 
Не нужны.

imper, смотрю ты смайликом заразился? :rolleyes:

ANIK123 09.10.2011 05:06

Ответ: Классы
 
Как не нужны?
Это ж обьявление обьекта в котором есть пользовательский конструктор без параметров О_О Или у Вас юмор такой?
Я новичок но вроде все правильно)

dsd 09.10.2011 12:46

Ответ: Классы
 
Вызов конструктора происходит автоматически при создании объекта.

ну или так, если тебе хочется лично вызывать конструктор:

MyClass MemberOne=MyClass();
Так как написал ты вроде можно если конструктор с параметрами :)

ANIK123 09.10.2011 15:34

Ответ: Классы
 
Если Мы задали Свой конструктор то даже если он без ни одного параметра надо полюбому добавлять скобки - ведь конструктор это функция которая вызивается при создании обьекта
Скобок не надо только если Мы не задавали ни одного Своего конструктора - тогда компилятор автоматически подставит свой - ничего не делающий
Как Я уже говорил: Я новичок но вроде все правильно)

dsd 09.10.2011 15:51

Ответ: Классы
 
Ок, ты прав.

Mr_F_ 09.10.2011 15:54

Ответ: Классы
 
Цитата:

Если Мы задали Свой конструктор то даже если он без ни одного параметра надо полюбому добавлять скобки - ведь конструктор это функция которая вызивается при создании обьекта
Скобок не надо только если Мы не задавали ни одного Своего конструктора - тогда компилятор автоматически подставит свой - ничего не делающий
Как Я уже говорил: Я новичок но вроде все правильно)
это чушь. если написать cCamera cam; то конструктор вызовется и без скобок. сам проверь. наверное в них и была трабла, я сразу внимания не обратил. при создании через new, можно их добавлять, можно не добавлять, конструктор тоже одинаково вызовется (опять же можешь проверить).

ANIK123 10.10.2011 02:32

Ответ: Классы
 
Я уже говорил что Я новичок потому извиняюсь за свою тупость)
Вооооот:
Цитата:

class ggg{
public:
ggg();
int fuck;
};
ggg::ggg(){fuck=0;}
int main(){ggg blablabla(); return 0;}
Этот код работает и с скобками и без! О_О


Просто выше написанное Я не правильно понял(
Извините - это меня сбило с толку(
Я должен был сразу Вас послушатся) А то идиот спорить начал - с программистами которые уже понаписали минимум по 1км кода))) В дальнейшем буду читать внимателнее) Спасибо всем кто направил меня на путь истинный)))

UPD
Цитата:

class ggg{
public:
ggg();
int fuck;
int bbb(int);
};
ggg::ggg(){fuck=0;}
int ggg::bbb(int g){return g;}
int main(){ggg blablabla(); blablabla.bbb(1); return 0;}
Работает только без скобок) Я шокирован)))

impersonalis 10.10.2011 10:45

Ответ: Классы
 
[Старпёр_mode]Ну а ситуация с деструктором (который вызывается сам или командой delete, а не x->~MyClass()), конструктором копирования (который вызывается всякий раз при переходе в MyFunc(MyClass x) и присваивании объектов*) не привела к мысли? А когда ты ещё и перегружать операции начнёшь, вот будете веселье... =)
[/Старпёр_mode]
Молодец, что разобрался. Удачи!

*-верно не всегда, см. alenacpp


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot