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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как не надо писать код 
:(
    Опции темы
Lycifer
Дата 7.7.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

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



kosmonaFFFt - вопрос такой:

Цитата

class Boo {
public:
    //Тут методы.
private:
    //Тут данные в виде:
    int a = 10;
    HANDLE Heap = GetProcessHeap();
    //И так далее
};


Как это скампилируеются  smile ?     HANDLE Heap = GetProcessHeap(); переменная должнать быть статической . И вправду такой код пугает  smile 
PM MAIL ICQ   Вверх
kosmonaFFFt
Дата 7.7.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Lycifer @  7.7.2008,  13:16 Найти цитируемый пост)
kosmonaFFFt - вопрос такой:Цитатаclass Boo {public:    //Тут методы.private:    //Тут данные в виде:    int a = 10;    HANDLE Heap = GetProcessHeap();    //И так далее};Как это скампилируеются   ?     HANDLE Heap = GetProcessHeap(); переменная должнать быть статической . И вправду такой код пугает   


как это компиллировалось не видел smile но в комплекте с исходником и просьбой "найти ошибку"
был приложен экзешник, который умел только дико глючить.


--------------------
user posted image
PM MAIL ICQ   Вверх
Ulysses4j
Дата 7.7.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mastaflow @ 3.5.2008,  17:58)
Особенно мне понравилась идея &(*flag)

Кстати, вполне нормаьлный мог бы быть код, если бы flag был итератором.


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Torsten
Дата 13.7.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Аленка
Цитата(Аленка @  14.11.2006,  23:38 Найти цитируемый пост)
Нас в институте учат сокращать код с if, else например, вот так
Код
int i=6;
int j=1;
void main()

    if ((i == 1) || (j == 1))
    {
        i++;
        j++;
    }
    else
    {
        i--;
        j--;
    }

}    

до 
Код

int i=6;
int j=1;
void main()
{
    (i == 1) ||(j == 1) ? (i++, j++) : (i--, j--);
}



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

iint i=6;
int j=1;
void main()

    if ((i == 1) || (j == 1))
        i++, j++;
    else
        i--,  j--;
}   

GrayCardinal
Цитата(GrayCardinal @  2.12.2006,  08:17 Найти цитируемый пост)
Насчет глобальных переменных. Ну и чего плохого в том, что будет глобальная структура со всеми настройками проги ? Лучше разбить на десяток объектов со своими свойствами, каждый из которых отвечает за свою функциональность ? А потом х.з. где у тебя "глубина дерева"................. Нет, _я_ конечно, найду... Тем же "бобиком", но................. Зачем ВЕЗДЕ И ВСЯ пихать классы ?! Хорошо научили что-ли, надо пользовать ?

Глобальный переменные использовать в С++ нельзя, это признак непрофиссиональность. Хранить настройки проги нужно в классе сингтоне. Классы везде пихать не нужно. Если функция не имеет отношения к классу ее нужно вынести отдельно с собственным пространством имен (namespace).

FelikZ

Цитата(FelikZ @  4.3.2007,  00:39 Найти цитируемый пост)
Как вам такое :
Код
typedef int THIS_IS_MY_INT;
#define TIMT THIS_IS_MY_INT
#define MY_CLASS_VALUE TIMT
//разумеется слова в дефайнах не такие, но сам смысл

 


В дефайнах - неправильно. В typedef - правильно. Подробнее об этом в книгах написано.

Цитата(FelikZ @  4.3.2007,  14:47 Найти цитируемый пост)
Он просто офигеет лазить по файлам(если проект огромный) и искать какой из дефайнов что означает...

Для этого и нужны IDE, там достаточно нажать один раз хоткей чтобы перенестись к месту обьявляния. Ну а самые продвинутые, так вообще специальных textEdit могут показывать это (в VS вверху он находится по умолчанию над редактором), нужно лишь курсор на тип поместить чтобы увидеть как он определен.


--------------------
We have no begining, we have no end. We are infinite.
PM MAIL   Вверх
Kallikanzarid
Дата 12.11.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

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



Цитата

а как же map<ErrorID, string> и exception::what()?


Лучше тогда уж error<id>::message, если конечно нет необходимости регистрировать ошибки в рантайме.
PM MAIL   Вверх
Kallikanzarid
Дата 12.11.2008, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

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



Цитата(nickless @ 21.11.2007,  23:48)
Код
class Vec3f
{
public:
  float x,y,z;

  Vec3f()
  {};
  Vec3f(float x,float y, float z)
    : x(x),y(y),z(z)
  {};
  Vec3f(float f)
    : x(f),y(f),z(f)
  {};

  inline const float &operator[](const int i) const
  { return *(&x+i); };

  inline float &operator[](const int i)
  { return *(&x+i); }; //((float *)(this))[i]; };

  inline int MaxDim() const
  {
    return (x > y)?((x > z)?0:2):((y > z)?1:2);
  }
};

// заметьте, класс кончился !!!

  /*! dot product */
inline float Dot(const Vec3f &a, const Vec3f &b)
{ return a.x*b.x+a.y*b.y+a.z*b.z; };

// еще 18 глобальных функций

Как говорится орфография и пунктуация аффтара сохранены smile

Вот он удивится при портировании на x64  smile 
PM MAIL   Вверх
bsa
Дата 12.11.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Kallikanzarid @ 12.11.2008,  10:46)
Вот он удивится при портировании на x64  smile

Ты выравнивание имел в виду?
PM   Вверх
Kallikanzarid
Дата 13.11.2008, 03:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

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



Цитата(bsa @ 12.11.2008,  13:55)
Цитата(Kallikanzarid @ 12.11.2008,  10:46)
Вот он удивится при портировании на x64  smile

Ты выравнивание имел в виду?

Сейчас проверил - видимо, я плохо знаю стандарт.
Код

#include <iostream>
using namespace std;

#pragma pack(push)
#pragma pack(8)

class test {
public:
    float a, b, c;
    test( float a_, float b_, float c_ ) : a(a_), b(b_), c(c_) {}
    float operator[]( size_t index ) { return (&a)[index]; }
};

int main() {
    test tst( 1.0f, 2.0f, 3.0f );
    cout << tst[0] << ' ' << tst[1] << ' ' << tst[2] << endl;
}

#pragma pack(pop)


Работает  smile 

Это сообщение отредактировал(а) Kallikanzarid - 13.11.2008, 03:53
PM MAIL   Вверх
nickless
Дата 14.11.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


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

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



Оно конечно работает (во всяком случае под 32 бит и gcc), но это не стандарт
Цитата

ISO/IEC 14882:2003
9.2 Class members

"Nonstatic data members of a (non-union) class declared without an intervening access-specifier
are allocated so that later members have higher addresses within a class object."

"Implementation alignment requirements might cause two adjacent members not to be allocated
immediately after each other
; ..."



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Kallikanzarid
Дата 14.11.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

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



Это не противоречит коду выше. Скорее всего, компилятор просто учел выравнивание и преобразовал (&x)[index] к ((char*)&x) + 8*index). Хотя, конечно, не факт, что будет компилироваться везде.
PM MAIL   Вверх
Fire-Plug
Дата 19.1.2009, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2005

Репутация: -1
Всего: 0



Цитата(likehood @ 2.4.2006,  15:52)
Цитата(UnrealMan @  2.4.2006,  11:48 Найти цитируемый пост)
А как ты в builder'е пробовал-то вызывать конструктор? Так:
pointer->Class() или так:
pointer->Class::Class() ?

Да и так и эдак - Builder не знает метода Class().
В VC6 второй вызов работает как надо, можно даже не через указатель а напрямую.

Полагаю, что вы не совсем поняли, что он предложил, а именно - вызвать конструктор класса через его полностью квалифицированное имя (fully qualified name), 
т.е.  
Код

class Class
{
public:
    Class() { ... }
 . . .
};

pointer->Class::Class();

хотя ПМСМ - это мазохизм в тяжелой форме. 
В тех упражнениях, что он предлагает, этот подход ещё можно как-то использовать и воспринимать как курьёз.

В реальных ООП проектах - это просто бред голимый. 
Например, как он собиратеся вызывать деструктор по указателю на базовый полиморфный класс, т.е. виртуальную ф-цию? Каким макро он собиратеся это делать?

ООП - это не только класс/структура с конструктором/деструктором и new/delete vs calloc/malloc/free. Это - как раз именно наследование и полиморфизм.
Так что подход, предлагаемый UnrealMan, можно выразить слоганом: прощай ООП.

Советую не принимать близко к сердцу, т.к. ник товарища говорит о многом - ну не любит он общепринятых решений для стандартных ситуаций.
НО есть положительный момент - заставляет снова осмыслить рациональное зерно С++ и его принципиальные отличия от С - и не только в плане выделения памяти. В конце концов, имеется placement new оператор...
PM MAIL   Вверх
Fire-Plug
Дата 19.1.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2005

Репутация: -1
Всего: 0



Цитата(Ignat @ 18.3.2006,  06:52)
Это не вопрос, а скорее крик души.
. . .

4. Собственно от чего я сегодня опупел - static-функции вне класса. Честно сознаюсь, никогда так не извращался, посему тот факт, что я её фиг увижу за пределами единицы трансляции поверг меня в уныние. Нэймспейсы, видимо, отменили специально для "аффтара". Для чего это вообще делалось, так и не понял.

. . .
Блин, по скромной оценке кода больше тысячи строк... Как дальше с этим работать просто загадка тысячелетия. Но если назвался груздем...

Были ли у вас такие подлянки? Как мне дальше разгребать?

Э-э-э-х, ваше счастье, уважаемый, - не видели вы гигантских С-шных проектов с файлами по 20+ тыс. строк кода и проектами к-либо из бизнес-компонент системы по 5,5 тыс. функций. Просто ф-ций; не методов; с тысячами callback-ф-ций - этим С-шным способом реализации полиморфного поведения... 
Лучше бы мои глаза их тоже не видели... Когда-то мне очень нравился этот язык, а теперь - ненавижу. Может даже не сам язык, а тех козлов - нынешних ветеранов-старперов и теперь уже почти сплошь директоров и менеджеров, кто за 15+ лет так не попытался мигрировать проект в ООП на С++, когда это еще было возможно. Теперь по неофициальной оценке code base превышает 6 млн. строк и нет ни возможности, ни ресурсов, ни самое главное - желания осуществить миграцию. Контора, плять, стабильная - неплохо платит и от дома 6,5 км... Пол-года маюсь и никак не решусь начать искать другую работу, чтобы о С не слышать больше вообще.

Ладно, эмоции в сторону. 
Объявление С-ф-ции(и/или переменной) в c/cpp-файле как static ограничивает ее область видимости рамками данного файла. Т.е. ниоткуда больше, как из данного файла, ф-ция не видна и, следовательно, не может быть вызвана, а переменная - не имеет доступа извне. При этом декларация ф-ции также находится в том же файле, а не в к-либо файле заголовка.
Идея - этакий вариант С-шной инкапсуляции. Наверное, в 1970 г. это была "плодотворная дебютная идея" (с).
Как видите - нет ничего общего со статическим методом/переменной-членом класса, кроме как самого модификатора static smile 
PM MAIL   Вверх
zim22
Дата 25.1.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



В книге С++ Primer рекомендуют избегать глубокого вложения условных выражений.
И приводят 2 примера кода для нахождения максимума из 3 значений.

1) Этот код не рекомендуют:
Код

int i = 10, j = 20, k = 30;
int max = i;
if (j > max) max = j;
if (k > max) max = k;

2) Пишут, что это значительно проще и наглядней:
Код

int max = i > j 
? i > k ? i : k 
: j > k ? j : k;

Вы тоже согласны с авторами? Лично мне кажется, что первый вариант наглядней...


--------------------
PM MAIL   Вверх
mes
Дата 25.1.2009, 18:08 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(zim22 @  25.1.2009,  16:59 Найти цитируемый пост)
рекомендуют избегать глубокого вложения условных выражений.


Цитата(zim22 @  25.1.2009,  16:59 Найти цитируемый пост)
Пишут, что это значительно проще и наглядней:

так как раз у второго кода вложение гораздо глубже )))

а третьего варианта там в пример не привели ?
Код

int max = std::max(std::max(i,j),k);


Это сообщение отредактировал(а) mes - 25.1.2009, 18:20


--------------------
PM MAIL WWW   Вверх
zim22
Дата 25.1.2009, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(mes @  25.1.2009,  18:08 Найти цитируемый пост)
а третьего примера не привели там ?
Код

int max = std::max(std::max(i,j),k);


о, отличный код! не привели, т.к. до stl не дошли ещё. 
до введения понятия итератор вектор проходили с помощью такого цикла:
Код

for (std::vector<int>::size_type index = 0; index != v.size(); ++index)

после введения итератора примеры в книге поменялись:
Код

for (std::vector<int>::const_iterator ci = vi.begin(); ci != vi.end(); ++ci)

Так что возможно когда до STL дойду, они исправятся и извинятся за некрасивый код smile



--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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