2

事情就是这样,我想要(可能不是最好的事情)能够调用一些类构造函数,该构造函数接收作为参数的指向正在调用的类的指针(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++ 中实现相同的结果?提前谢谢。

4

5 回答 5

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名为的对象someOtherClass

于 2011-08-22T07:45:15.007 回答
2

可能不是最好的事情

这可能不是一个坏主意。但是,每次在 C++ 中使用指针时,都必须完全清楚它将如何使用:指向的是什么类型的东西(不仅仅是指针的类型,还有标量 vs. 数组等),如何使用指向的东西到达那里(例如,通过new?作为其他对象的一部分?其他东西?),以及如何将其全部清理干净。

如何在 C++ 中实现相同的结果?

new几乎相同,当然除了 C++在您按值创建本地实例时不使用(因此我们改为编写SomeClass c = SomeClass(this);,或更简单SomeClass c(this);的 ),并且我们必须了解指针与值类型(因此 SomeClass::someOtherClass 现在是a SomeOtherClass *,这也是我们在构造函数中接受的类型)。您还应该强烈考虑使用初始化列表来初始化数据成员,因此SomeClass::SomeClass(SomeOtherClass* someOtherClass): someOtherClass(someOtherClass) {}.

于 2011-08-22T07:46:17.750 回答
1

你也可以在 C++ 中做几乎相同的事情:

class B;

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

private:
  B * pb;
};

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

private:
  A a;
};

问题是,你真的需要吗?

于 2011-08-22T07:45:42.247 回答
0

也许像这样:)

class SomeOtherClass;

class SomeClass
{
private:
  SomeOtherClass * someOtherClass;
public:
  SomeClass(SomeOtherClass *someOtherClass)
  {
    someOtherClass = someOtherClass;
  }
};
class SomeOtherClass
{
public:
  void SomeOtherMethod()
  {
    SomeClass *c = new SomeClass(this);
  }
};
于 2011-08-22T07:55:17.760 回答
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
    }
};
于 2011-08-22T08:44:46.743 回答