Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 22 из 87<  1 ... 19  20  21  22  23  24  25 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Junior
Статус: Не в сети
Регистрация: 04.05.2006
Откуда: Чайковский.
Спасибо ребята обоим. Жаль щас проверить не могу.

_________________
Никогда не говори никогда!



Партнер
 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
nickyoz писал(а):
Передача по ссылки имеет смысл практически всегда, когда внутри функции ты не изменяешь объект.
Пардон, это вдруг почему? Передача по константной ссылке имеет смысл практически всегда. Если хочешь изменить объект - то просто по ссылке, или передавать указатель, как это любят делать в больших библиотеках, в том же QT. Они считаю, что obj->method(&instance) нагляднее демонстрирует то, что объект измениться, нежели obj->method(instance).

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
Daemon
Хм. Наглядность не есть цель. Цель - гарантирование валидности объекта при передачи. Хотя конечно это вопрос удобства.
Хотя про константность ты прав. Это ещё более повышает поиск ошибок. Я просто не стал редактировать запись, когда прочитал твой предыдущий пост

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
nickyoz писал(а):
Хм. Наглядность не есть цель.
Наглядность - очень важная цель. В этом убеждаешься после часовых разборов "кода" наших индусских друзей. :)


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
Билли Бонс Ну. С индусским кодом совсем плохо...
Мое ИМХО ( и не только мое) - назвнаие класса/метода/переменой должно полноценно определять его семантику

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Почему-то не получается использовать глобальные переменные с помощью слова extern. Нужна глобальная переменная, одна на всю программу, к которой также бы имели доступ методы класса. Класс находится в отдельном файле. Объявляю переменную в заголовочном файле stdafx.h (который подключаю ко все файлам), затем в файле реализации моего класса определяю эти переменные, используя extern, но использовать их не получается в функциях членах класса:
фрагмент stdafx.h:
Код:
...
float
   x_0=0,
   y_0=0,
   globCompr=1,
   zScale=1;
bool coo_def=false;
...

фрагмент CGrid.cpp:
Код:
...
#include "stdafx.h"

extern float
   x_0,
   y_0,
   globCompr,
   zScale;
extern bool coo_def;

void CGrid::defineCoo()
{
   if (!coo_def)
   {
      coo_def=true;
      x_0=100;
      y_0=200;
      globCompr=100;
   }
   ySize=ySize/globCompr;
}
...


Все это хозяйство не компилируется, выводит ошибки вида error LNK2005: "float x_0" (?x_0@@3MA) already defined in CGrid.obj, file - stdafx.obj.


 

Junior
Статус: Не в сети
Регистрация: 04.05.2006
Откуда: Чайковский.
И еще один вопрос. Как занести в двоичный файли прочитать из него список состоящий из структур вида.
Код:
  struct worker
       {
          char name[];
          char sorname[];
          char work[];
          char age[];
        };


У меня почему то при попытке занести и прочитать или вылетает все что можно или просто напросто выводит какие то иероглифы и зацикливается.

_________________
Никогда не говори никогда!


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
kexman Никогда не объявляй переменные в .h-файле. Это путь на тёмную сторону Силы. :)


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Кривая книга Липпмана, надо было наоборот extern писать в заголовочном файле, а не в срр. Тогда вопрос, будет ли доступ к этой переменной из других файлов проекта, если я подключу к ним stdafx.h?


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
jeki Так ты же, наверное, указатели читаешь/пишешь, а не сами данные. :)
Добавлено спустя 42 секунды
kexman угу


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Билли Бонс
:) И все-таки как сделать глобальную переменную, чтобы ее могли использовать и методы класса и допустим я мог ее изменять в функции main() моей программы?


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
jeki ты приведи полный вид структуры и функции чтения и записи. Тогда посмотрим.
kexman писал(а):
И все-таки как сделать глобальную переменную, чтобы ее могли использовать и методы класса и допустим я мог ее изменять в функции main() моей программы?

Обьявляй переменную в пределах функции main(или хоть глобально в том же файле) и передавай классу указатель на переменую(в конструкторе или отдельным методом) :) .


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
mein
А если таких переменных 4?


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
kexman
Хм, я тут подумал а почему бы тебе не изменять эти перенные методами класса?


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
kexman Да в чём проблема-то? Переменную объявляешь в любом (в одном) .cpp файле, пишешь в подключаемый определение с extern, всё.


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Билли Бонс
Не понял, можно подробнее, для этого отдельный .cpp файл надо создавать и включать его во все файлы, где нужен доступ к этой переменной?
mein
Они и так должны изменяться методами класса.


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Код:
// myclass.cpp

int g_MyGlobalVar;

//...

Код:
// myclass.h

extern int g_MyGlobalVar;

//...

Везде, где нужен доступ к g_MyGlobalVar, инклюдишь myclass.h


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman короче говоря, есть такая штука - как единица трансляции, это С++ фаил после обработки его препроцессором, т.е. включения в него всех h файлов. Представь, что если глобальные переменные объявить в h файле? Каждая единица трансляции будет содержать свою копию переменной. Нужно определить переменную в любом С++ файле, и объявить ее с директивой extern в нужном тебе файле. А вообще - это порочная практика, глобальные переменные.
Добавлено спустя 1 минуту, 21 секунду
PS Форум программирование приобретает большую популярность, это хорошо ;)

_________________
Ку ку


Последний раз редактировалось Daemon 06.12.2006 18:38, всего редактировалось 1 раз.

 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
kexman писал(а):
Они и так должны изменяться методами класса

Если твоя функция main видит класс, то значит и видит и его методы. Сделай методы изменяющие каждую переменную по отдельности и меняй на здоровье. Скорее всего не потребуются даже глобальные переменные. Типа того:

myclass.h
Код:
class myclass{
          int globvar; // не glob конечно, но для наглядности
          ....
public:
          void SetGlobVar(int var) { globvar = var; }
          int GetGlobVar() { return globvar; }
          int* Get_pGlobVar() { return &globvar; };
          ...
};

main.cpp
Код:
#include "myclass.h"
int main()
{
        myclass obj;
        obj.SetGlobVar(20);
       
        // или так. Некрасиво конечно ... :)
        int* pg = obj.Get_pGlobVar();
        (*pg) = 20;
}


 

Junior
Статус: Не в сети
Регистрация: 04.05.2006
Откуда: Чайковский.
что то типа этого. Тока оформлено не функциями т.к. это тестовая прога а не та где мне нужно чтение и запись в файл. Что неправильно? Обычно вылетае на последней скобке. именно это мне и кажется странным.
Код:
struct worker
 {
  char  name[];
  char  sorname[];
  char  work[];
  char  age[];
  worker * next;
  worker * prev;
 };

void main()
 {
   clrscr();
   FILE *f_work;
   worker *f,*p;
        f_work=fopen("Work.dat","wb");
   f=new worker;
    cin>>f->name;
    cin>>f->sorname;
    cin>>f->work;
    f->next=NULL;
    f->prev=f;
    cout<<f->name<<" ";
    fwrite(&f,sizeof(worker),1,f_work);

  fclose(f_work);
 
  f_work=fopen("Work.dat","rb");

  cout<<"\n";

   while (!feof(f_work))
  {

   fread(&p,sizeof(worker),1,f_work);               
      cout<<p->name<<" ";              
  }
  fclose(f_work);
  getche();

  }

_________________
Никогда не говори никогда!


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 22 из 87<  1 ... 19  20  21  22  23  24  25 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan