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

Вот что я хочу (вероятно, не самое лучшее) иметь возможность вызывать некоторый конструктор класса, который получает в качестве параметра указатель на класс, который вызывает (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 ответов

Решение

наверное не лучшая вещь

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

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

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

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,

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

class B;

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

private:
  B * pb;
};

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

private:
  A a;
};

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

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

class SomeOtherClass;

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

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
    }
};
Другие вопросы по тегам