оператор this

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
100kg
ст. сержант
Сообщения: 393
Зарегистрирован: 2006-05-18 14:01:32

оператор this

Непрочитанное сообщение 100kg » 2008-01-28 1:00:22

Код: Выделить всё

zProc = new QProcess(this);
zProc->execute(cWgetLine);
а что будет если мы неявно обратимся тоесть zProc.execute(cWgetLine)? заметил что явное обращение происходит когда динамически создаем объекты.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: оператор this

Непрочитанное сообщение Fastman » 2008-01-28 11:50:21

100kg писал(а):

Код: Выделить всё

zProc = new QProcess(this);
zProc->execute(cWgetLine);
а что будет если мы неявно обратимся тоесть zProc.execute(cWgetLine)? заметил что явное обращение происходит когда динамически создаем объекты.
Можно конечно, но:
Стек не резиновый. Много нельзя запихнуть. А при работе с потоками вообще есть ограничение которое зависит от операционной системы :

void QThread::setStackSize ( uint stackSize )
Sets the maximum stack size for the thread to stackSize. If stackSize is greater than zero, the maximum stack size is set to stackSize bytes, otherwise the maximum stack size is automatically determined by the operating system.
Warning: Most operating systems place minimum and maximum limits on thread stack sizes. The thread will fail to start if the stack size is outside these limits.

С++ не для удобства - а для написания программ :))) И понимания управления памаятью - один из самых непростых вопросов. Плюс многопоточные приложения не так просты как кажутся )
Главное в жизни здоровье и любовь, остальное я все куплю.

100kg
ст. сержант
Сообщения: 393
Зарегистрирован: 2006-05-18 14:01:32

Re: оператор this

Непрочитанное сообщение 100kg » 2008-01-28 15:08:49

ясно, я просто хотел узнать что будет если обратиться zProc.execute(cWgetLine), оказываеться компилятор ругаеться,
вот что написал для проверки

Код: Выделить всё

#include <iostream>
#include <new>
 
using std::cout;
using std::cin;
using std::endl;
 
class Test {
 
 public:
  Test (int = 0, int = 0);  
  ~Test();
 
  void  setX(int);
  void  setY(int);
 
  int getX();
  int getY();
 
  void printall();  
  
 private:
  int x;
  int y;
};
 
Test::Test(int  Xvalue, int  Yvalue )
{
 
 setX(Xvalue);
 setY(Yvalue);
 
}
 
void Test::setX(int Xvalue) {
 
 x=Xvalue;
 
}
 
void Test::setY(int Yvalue) {
 
 y=Yvalue;
 
}
 
int Test::getX() {
 
return x;
 
}
 
int Test::getY() {
 
return y;
 
}
 
void Test::printall() {
 
  cout << "X value is: " << getX() << endl
       << "Y value is: " << getY() << endl;
}
 
int main () {
 
 Test *t1ptr;
 t1ptr = new Test(3,4);
 
/*must be t1ptr->printall(); or (*t1ptr).printall();
 t1ptr.printall(); gives error */
 
 t1ptr->printall(); 
 
 return 0;
}
если t1ptr.printall();

Код: Выделить всё

test.cpp:70: error: request for member `printall' in `t1ptr', which is of non-class type `Test*'

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: оператор this

Непрочитанное сообщение Fastman » 2008-01-28 15:45:43

Естесственно. ты же сделал

Код: Выделить всё

Test *t1ptr;
t1ptr = new Test(3,4);
Так будь добр обращаться по указателю.. то есть через "->"
А если бы ты написал:

Код: Выделить всё

Test t1ptr(3,4);
t1ptr.printall();
Оно бы скомпилилось.
По пробую пояснить:
В твоем случае (Test *t1ptr;) t1ptr - является указателем на объект класса.
В языке С++ "->" это операция вызова УКАЗАТЕЛЯ класса а "." члена класса.
Не забывай что если ты определяешь Test t1ptr(3,4); то область жизни t1ptr будет в пределах члена класса.
то есть:

Код: Выделить всё

void SomeOtherClass::foo()
 {
Test t1ptr(3,4);
t1ptr.printall();
//при выходе t1ptr будет уничтожен
}
а в случае ессли сделаешь так например

Код: Выделить всё

class SomeOtherClass
{
    SomeOtherClass();
    ~SomeOtherClass();
    void foo();
    void foo2();
    Test *t1ptr;
}

SomeOtherClass::SomeOtherClass()
{
    t1ptr = new Test(3,4);
}

void SomeOtherClass::foo()
{
    //можем тут напечатать твои значения
     t1ptr->printall();
}

void SomeOtherClass::foo2()
{
    //и тут можем напечатать твои значения
     t1ptr->printall();
}

//И !!! Не забываем сделать !!!!
SomeOtherClass::~SomeOtherClass()
{
    if(t1ptr != NULL)
       delete t1ptr;
}
как то вот так.
Главное в жизни здоровье и любовь, остальное я все куплю.

100kg
ст. сержант
Сообщения: 393
Зарегистрирован: 2006-05-18 14:01:32

Re: оператор this

Непрочитанное сообщение 100kg » 2008-01-28 16:42:50

ах да забыл удалить указатель. все спасибо.