[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Dimaus

    Dimaus Banned

    Joined:
    7 Nov 2008
    Messages:
    30
    Likes Received:
    1
    Reputations:
    0
    Нужно код для линукс мандрива переписать, если есть ошибки помогите найти)
     
  2. Stis-mag

    Stis-mag New Member

    Joined:
    22 Nov 2010
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Как узнать длину строки и как присвоить переменной это значение?

    String s=Edit1->Text;
    unsigned strlen(int *s);
     
  3. SVLCH

    SVLCH New Member

    Joined:
    6 Feb 2011
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    #include <iostream> а не <iostream.h>
    using namespace std;

    clrscr() из conio.h заменить на system("clear") из stdlib.h и все должно работать.
     
  4. Traur

    Traur New Member

    Joined:
    11 Oct 2010
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Как создать тему???и где эта функция находится?
     
  5. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    как по вашему элегантно решить задачу:

    класс1 должен содержать указатель на класс2, который должен инициализироваться классом1 :)

    Вариант:
    Создать объект класса1
    Создать объект класс2 с передачей ему указателя на ранее создынне объект класса1
    Передать в объект класса1 указательно на объект класса2

    Не предлогать :)
     
  6. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    Ну так в чем проблема?
    1) В классе 1 заводишь переменную под указатель
    2) в классе 2 пишешь ф-цию типа {return this}
    3) вызываешь конструктор класса 2 из класса 1
    4) а потом указателю в классе1 присваиваешь результат этой ф-ции.
    Если я все правильно понял.

    UPD: Но есть момент: класс2 должен быть глобальным, или обьявленным в классе1. Если он глобальный, то нужно внимательно следить, когда он будет уничтожен. Потому как если его уже не будет, то указатель класса1 будет указывать непонятно куда.
     
    #6126 =Zeus=, 16 Feb 2011
    Last edited: 16 Feb 2011
  7. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    Что значит класс глобальный ? О_о всмысле объект класса глобальный ? или область видимости класса глобальная ?

    конструктор класса2 вызывать из конструктора класса1 ? Но конструктору класса2 нужно передать указатель на объекта класса1, тобишь this обеъкта класса1. Интерестно проканает :) думаю что нет, Хотя этож указатели... должно проканать.
     
  8. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    cupper
    В книгах описывают данную ситуацию так - неправильное проектирование. Возможно, стоит создать ещё один класс, который будет этаким проводником. В общем, смотри в сторону архитектуры, это полезная вещь. Заодно добьешься максимальной декомпозиции.
     
  9. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    Ой, всмысле обьект глобальный. Но вообще лучше избегать такого. А конструктор класа вызывается не из конструктора первого, а просто из ф-ции например:
    Code:
    class A
    {
    public:
      A();
      sometype createBObj() {B b; myptr = b.getMyPointer()};
      sometype myPtr;
    }
    
    class B
    {
    public:
      B();
      sometype& getMyPointer() {return *this;};
    }
    Ну типы сам поставь какие нужно. Примерно так? Просто класс1 создает указатель на класс2, и сам его инициализирует. :rolleyes:
     
  10. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    cupper
    Что-то я ничего не понял.
    Code:
    class A()
    {
    private:
         B* b;
    public:
         A(){ b = new B();}
    };
    
    class B()
    {
    public:
         B(){ }
    };
    
     
    1 person likes this.
  11. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    Может и так, варианты похожи. Из задания не очень понятно, какой более правильный. Думаю автор разберется сам ))
     
  12. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    вот так делать можно ?)
    ----------------------------------------

    Нужно вести статистику поступление некоторых данных, ну мол максимальное время получения, минимальное, среднее, количество данныех полученной за секунду (миксимальное, мнимальное, среднее).

    реализовал это на boost ptime + different_time теперь думаю может зря...

    Может лучше и проще и быстрее было бы заюзать clock_t ?

    И еще, как лучше делать замеры какой либо проделанной работы за промежуток времени ?

    Например у меня для каждого полученной единици данных вызывается функция в которой я фиксирую статистику. Собирать таким образом статистику для конкретного единицы легко (зафиксировал время отправки, зафиксировал время приема). Но вот колличесво полученных данных за 1 секунду у меня судя по всему реализовано криво. делаю примерно так
    Code:
    // this->seconds_ -  время используемое для отсчета
    perSecond = currentTime - this->seconds_;
    // если с момента фиксации времение прошло больше 1 
    // секунды, фиксируем накопленную статистику, и сбрасываем 
    // счетчики и время для отстчета на текущее
    			if(perSecond.seconds() > 1)
    			{
    				if(this->msgPerSecond_ > 0)
    				{
    					if(this->msgPerSecond_ < this->minSentMsgPerSec_)
    					{
    						this->minSentMsgPerSec_ = this->msgPerSecond_;
    					}
    					if(this->msgPerSecond_ > this->maxSentMsgPerSec_)
    					{
    						this->maxSentMsgPerSec_ = this->msgPerSecond_;
    					}
    					this->averageSentMsgPerSec_ += this->msgPerSecond_;
    					++currentnumberSecond_;
    					this->msgPerSecond_ = 0;
    					this->seconds_ = boost::posix_time::microsec_clock::local_time();
    				}
    				else
    				{
    					// первый заход, устанавливаем новое корректное время
    					this->seconds_ = boost::posix_time::microsec_clock::local_time();
    				}
    			}
    			++(this->msgPerSecond_);
    
     
  13. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    Как ты написал точно нельзя. Порядок декларирования не позволит.

    За то можно забацать интерфейс. (и не забыть написать delete)
    Code:
    class IA
    {
    public:
    	virtual void foo()=0; 
    };
    
    class B
    {
    	public:
    	B(IA* a)
    	{
    		a->foo();
    	}
    };
    
    class A : public IA
    {
    	public:
    		A()
    		{
    			B* b = new B(this);	
    		}
    
    		void foo(){}
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
    	A* a = new A();
    	return 0;
    }
     
    #6133 Irdis, 19 Feb 2011
    Last edited: 19 Feb 2011
  14. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    Абсолютно согласен что как я написал не позволит порядок декларирования. Но ! эврика - мервки - тусуем - мусем и.... бац.

    http://liveworkspace.org/code/b0365b4330e5808fd2c198bbeb0e3636

    по сути этот пример даже по логики подходит под мой случай. Т.к. класс B, в моем случае, это класс библиотеки. Ему при инициализации нужно передать указатель на класс (который я уже должен написать сам, в этом случае это класс А) который был бы унаследован от виртуального библиотечного класса. Дальше рассписывать не буду зачем оно так нужно, потому что это вас сильно запутает. Но так вот построена логика библиотеки.
    Весьма чистое решение, без чего либо лишнего и нагроможденного :)

    Вот так по сути оно выглядит
    http://liveworkspace.org/code/f8a78555f55e09524e9c1619cd1b4bc7

    Где A_BASE предоставляет обработчики неких событий которые может вызывать B, поэтому в B нужно зарегестрировать указатель на экземпляр этого класса.

    Но так как A_BASE класс виртаульный, мы должны унаследовать от него и непосредственно определить логику работы в этих обработчиках. По сути через унаследованный класс строится логика работы с B, поэтому было желани все работы (включая и с B) инкапсулировать в классе A.
     
    #6134 cupper, 19 Feb 2011
    Last edited: 19 Feb 2011
  15. Double2

    Double2 Banned

    Joined:
    9 Jan 2010
    Messages:
    20
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток. Такой вопрос, как сделать обращение к какому либо компоненту в Visual C++? Например, к текстовому полю с названием Edit1. Ввожу Edit1.Text, мне компилятор выдает ошибку, что-то типа "Возможно вы имели в виду ->". Пишу Edit1->Text, так он вообще какую-то ересь выдает... Подскажите, как правильно?
     
  16. Double2

    Double2 Banned

    Joined:
    9 Jan 2010
    Messages:
    20
    Likes Received:
    0
    Reputations:
    0
    Вопрос закрыт :) Уже понял
     
  17. j-prof

    j-prof Banned

    Joined:
    29 Aug 2010
    Messages:
    321
    Likes Received:
    11
    Reputations:
    -4
    в чем отличе между cout и printf :D
     
  18. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    ни в чем, обе рано или поздно делаю системный вызов write :)
     
  19. R0nin

    R0nin Member

    Joined:
    11 Jul 2010
    Messages:
    261
    Likes Received:
    24
    Reputations:
    8
    cout (читать как си-аут) это объект языка C++, принимает данные с консоли, имеет перезагруженные операторы, работать с ним намного легче чем с printf, во всех смыслах этого слова.
    printf фунцкия языка C, можно и в C++ воспользоватся, не такая удобная как cout - приходится в "ручную" настраивать.
     
  20. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    cout удобный говоришь ?))

    Code:
    cout << "Мне " << year << " лет " << month << " месяцев и " << day << " дней, и я " << pi << "здец как заебался это писать" << endl;
    Code:
    printf("мне %d лет %d месяцев и %d дней и я %4.2fздец не заебался\n", year, month, day, pi);
    cout - это поток, в который кидаешь что попало а он сам определяет что это и как это нужно выводить.
    printf принимает строку форматирования и непосредственно сами выводимые параметры.
     
Thread Status:
Not open for further replies.