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