c ++这个指针问题

时间:2011-08-22 07:39:45

标签: c++ this-pointer object-construction

这是我想做的事情(可能不是最好的事情)能够调用一些类构造函数,它接收一个指向调用类的指针(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 个答案:

答案 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
    }
};