这是我想做的事情(可能不是最好的事情)能够调用一些类构造函数,它接收一个指向调用类的指针(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 ++中实现相同的结果呢? 提前完成。
答案 0 :(得分:5)
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
的{{1}}对象。
答案 1 :(得分:2)
可能不是最好的事情
这可能不是一个坏主意。但是,每次在C ++中使用指针时,必须 完全清楚它将如何使用:指向的是什么类型(不仅仅是指针,但是标量与数组等等),指向的东西如何到达那里(例如通过new
?作为其他一些对象的一部分?还有什么?),以及如何清理它们
如何在c ++中实现相同的结果?
几乎完全相同,当然除非C ++在按值创建本地实例时不使用new
(所以我们改为编写SomeClass c = SomeClass(this);
,或者更简单地SomeClass c(this);
),我们必须知道指针与值类型(所以SomeClass :: someOtherClass现在是SomeOtherClass *
,这也是我们在构造函数中接受的类型)。您还应该强烈考虑使用初始化列表来初始化数据成员,因此SomeClass::SomeClass(SomeOtherClass* someOtherClass): someOtherClass(someOtherClass) {}
。
答案 2 :(得分:1)
你也可以在C ++中做同样的事情:
class B;
class A
{
public:
A (B * b) : pb (b) { }
private:
B * pb;
};
class B
{
public:
B () : a (this) { }
private:
A a;
};
问题是,你真的需要吗?
答案 3 :(得分:0)
也许是这样:))
class SomeOtherClass;
class SomeClass
{
private:
SomeOtherClass * someOtherClass;
public:
SomeClass(SomeOtherClass *someOtherClass)
{
someOtherClass = someOtherClass;
}
};
class SomeOtherClass
{
public:
void SomeOtherMethod()
{
SomeClass *c = new SomeClass(this);
}
};
答案 4 :(得分:0)
'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
}
};