с ++ этот вопрос указатель - PullRequest
       34

с ++ этот вопрос указатель

2 голосов
/ 22 августа 2011

Здесь я хочу (вероятно, не самое лучшее) иметь возможность вызывать некоторый конструктор класса, который получает в качестве параметра указатель на класс, который вызывает (ufff !!!). Ну, в коде выглядит лучше, вот так, как я делаю в C #.

public class SomeClass
{
   SomeOtherClass someOtherClass;

   //Constructor
   public SomeClass(SomeOtherClass someOtherClass)
   {
      this->someOtherClass = someOtherClass;
   }
}

public class SomeOtherClass
{

   public SomeOtherMethod()
   {
      SomeClass c = new SomeClass(this);
   }
}

Итак, как мне достичь того же результата в c ++? Спасибо заранее.

Ответы [ 5 ]

5 голосов
/ 22 августа 2011
class SomeOtherClass;  // forward declaration (needed when used class is not visible)
class SomeClass
{
   SomeOtherClass *someOtherClass;
public:
   SomeClass(SomeOtherClass *some) : someOtherClass(some)
   {}  // this is called initialization at constructor (not assignment)
}

class SomeOtherClass
{
public:
   SomeOtherMethod()
   {
      SomeClass *c = new SomeClass(this);
   }
}

Отвечая на ваши требования выше, также обратите внимание, что в C ++ вам действительно не нужно объявлять объекты всегда с new. Если вы объявите,

SomeOtherClass someOtherClass;

тогда это означает, что у вас есть объект SomeOtherClass с именем someOtherClass.

2 голосов
/ 22 августа 2011

вероятно, не самое лучшее, что можно сделать

Возможно, это не плохая идея.Однако каждый раз, когда вы используете указатели в C ++, вы должны быть полностью ясно о том, как они будут использоваться: на что указывает указатель (а не только на тип указателя), но скаляр против массива и т. д.) как указанная вещь попадает туда (например, через new? Как часть какого-то другого объекта? Что-то еще?), и как все это будет очищено.

Как добиться того же результата в c ++?

Почти идентично, за исключением того, что C ++ не использует new при создании локального экземпляра по значению (поэтому мывместо этого напишите SomeClass c = SomeClass(this);, или, проще, SomeClass c(this);), и мы должны знать о типах указатель и значение (поэтому SomeClass :: someOtherClass теперь является SomeOtherClass *, который также является типом, который мы принимаем в конструкторе),Вам также следует рассмотреть возможность использования списков инициализации для инициализации элементов данных, поэтому SomeClass::SomeClass(SomeOtherClass* someOtherClass): someOtherClass(someOtherClass) {}.

1 голос
/ 22 августа 2011

Вы можете сделать почти то же самое в C ++:

class B;

class A
{
public:
  A (B * b) : pb (b) { }

private:
  B * pb;
};

class B
{
public:
  B () : a (this) { }

private:
  A a;
};

Вопрос в том, действительно ли вам это нужно?

0 голосов
/ 22 августа 2011

'this' является указателем на const в функциях-членах (методах), объявленных как const Итак:

void f1(X* p);
void f2(const X* p);

class X {
    void m1() {
        f1(this); // OK
        f2(this); // also OK
    }
    void m2() const {
        f2(this); // OK
        f1(this); // error, 'this' is a pointer to const X
    }
};
0 голосов
/ 22 августа 2011

Может быть так:)

class SomeOtherClass;

class SomeClass
{
private:
  SomeOtherClass * someOtherClass;
public:
  SomeClass(SomeOtherClass *someOtherClass)
  {
    someOtherClass = someOtherClass;
  }
};
class SomeOtherClass
{
public:
  void SomeOtherMethod()
  {
    SomeClass *c = new SomeClass(this);
  }
};
...