как передать «это» в с ++

function send() {
  setTimeout(function() {
    window.open("mailto:" + document.getElementById('email').value + "?subject=" + document.getElementById('subject').value + "&body=" + document.getElementById('message').value);
  }, 320);
}
input {
  text-align: center;
  border-top: none;
  border-right: none;
  border-left: none;
  height: 10vw;
  font-size: 2vw;
  width: 100vw;
}

textarea {
  text-align: center;
  border-top: none;
  border-right: none;
  border-left: none;
  border-radius: 5px;
  width: 100vw;
  height: 50vh;
  font-size: 2vw;
}

button {
  border: none;
  background-color: white;
  position: fixed;
  right: 5px;
  top: 5px;
  transition: transform .5s;
}

input:focus {
  outline: none;
  color: orange;
  border-radius: 3px;
}

textarea:focus {
  outline: none;
  color: orange;
  border-radius: 7px;
}

button:focus {
  outline: none;
  transform: scale(0);
  transform: rotate(360deg);
}
<!DOCTYPE html>
<html>

<head>
  <title>Send Email</title>
</head>

<body align=center>
  <input id="email" type="email" placeholder="yourfreind@something.somthing"></input><br><br>
  <input id="subject" placeholder="Subject"></input><br>
  <textarea id="message" placeholder="Message"></textarea><br>
  <button id="send" onclick="send()"><img src=https://www.dropbox.com/s/chxcszvnrdjh1zm/send.png?dl=1 width=50px height=50px></img></button>
</body>

</html>

16
задан fduff 16 April 2015 в 12:26
поделиться

6 ответов

Вы правильно его используете. Указатель this указывает на текущий экземпляр объекта.

class helper 
{
public:
     void help(worker *pWorker) {
          //TODO do something with pWorker . . .
     }

     void help2(worker& rWorker) {
          //TODO do something with rWorker . . .
     }
};

class worker 
{
public:
     void dowork() {
          //this one takes a worker pointer so we can use the this pointer.
          helper.help(this);

          //to pass by reference, you need to dereference the this pointer.
          helper.help2(*this);
     }
     helper helper;
};

Также предположим, что вы объявляете worker * pW = new worker () . Если вы вызовете один из методов (dowork) для объекта pW , вы заметите, что указатель this и pW имеют одинаковое значение (они оба имеют одинаковый адрес).

(не тестировал это, чтобы убедиться, что он работает, но я думаю, что должен).

23
ответ дан 30 November 2019 в 16:30
поделиться

В C ++ this является ключевым словом, которое определяется как «указатель на текущий экземпляр объекта». Итак, ваш приведенный выше код верен.

В зависимости от отношения наследования / композиции между ClassA и ClassB , вероятно, есть более эффективные способы добиться того, что вы делаете, чем использование этот указатель.

9
ответ дан 30 November 2019 в 16:30
поделиться

Совершенно нормально передавать «это» или «* это», как вы это делаете.

Жизненные опасности:

Один из моментов в приведенном вами примере заключается в том, что вы вызываете doSth из конструктора ClassA . Объект, переданный в doSth , возможно, является частично сконструированным объектом:

class ClassC {
public:
  ClassC ()
  : m_c ()
  {}
  int m_c;
};

class ClassA : public ClassC {
public:
  ClassA (ClassB & b)
  : ClassC ()
  , m_b ( b.doSth (this) )  // ClassC constructed
                            // ClassA members partially init.
  {
    b.doSth (this);         // ClassA members initialized
  }

  // ...
  int m_a;
};

class ClassD : public ClassA {
public:
  ClassD(ClassB & b)
  : ClassA (b)              // Partially init
  , m_d ()
  {
                            // ClassC and ClassA constructed
                            // ClassD members initialized
  }
  int m_d;
};

Могут возникнуть проблемы, если doSth использует члены, которые еще не инициализированы:

void ClassB::doSth (ClassA * a) {
  int i = a->m_c;     // OK m_c is initialized

  int j = a->m_a;     // Not OK, m_a not initialized when called
                      // from member initialization list.

  int k = static_cast<ClassD*> (a).m_d;  // Not OK
}

Использование динамического типа объекта:

Наконец, любое использование динамического типа объекта (например, виртуальные вызовы, dynamic_cast, typeid) будет иметь разные результаты для частично созданного объекта, чем для полного объекта (и в некоторых случаях вы можете иметь неопределенное поведение).

void ClassB::doSth (ClassA * a) {
  if (ClassD * d = dynamic_cast<ClassD *> (a))
  {
    // Never true when called from ClassA::ClassA
  }
}
5
ответ дан 30 November 2019 в 16:30
поделиться

В этом случае при использовании этот передаст указатель на класс вызывающего абонента, которым является A, в b.DoSth. Похоже, вы все делаете правильно. это ключевое слово всегда указывает на экземпляр класса, из которого вы его используете.

2
ответ дан 30 November 2019 в 16:30
поделиться

this - указатель на экземпляр объекта, поэтому то, что вы делаете, правильно.

Прочтите это для получения дополнительной информации.

0
ответ дан 30 November 2019 в 16:30
поделиться

this является const указатель на собственный объект. этот указатель не подлежит изменению.

  ClassA::ClassA( ClassB &b) {

        b.doSth(this);
        // here 'this' refers to this object ie the instance of ClassA. 
        // When you pass 'this' to doSth function --> is equivalent to passing 
        // the instance of current object of ClassA.
        //   
    }
0
ответ дан 30 November 2019 в 16:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: