【问题标题】:Create a pointer inside a constructor to point to the instance of the class in C++在构造函数中创建一个指针以指向 C++ 中类的实例
【发布时间】:2012-03-14 22:45:13
【问题描述】:

我对这些 C++ 指针有点困惑,我想知道是否可以在构造函数中创建一个指向类实例的指针(以下内容)。

class Room{
public:  
    Room();  
    ~Room();  
private:  
    Room* ptrToSelf;  
};  

Room::Room(){  
    ptrToSelf = &(what should I write in here to have the pointer point to it)  
}

我知道这听起来可能很疯狂(这里是新手),但我只是想知道这是否可能。有人可以向我解释一下吗。
非常感谢

编辑:
谢谢大家这么快回复我。我问是因为我想使用公共Room*::getPointer(); 方法来返回类的指针。我有一个从一个房间移动到另一个房间的角色,我正在使用指针来实现这一点。我以字符串的形式从用户那里获取输入,但我无法将该字符串传递给我创建的 character.moveTo(const Room*) 方法。我需要一种将字符串“转换”为类指针的方法,以便我可以将指针传递给方法。

编辑:
我正在考虑实现一种方法,该方法将根据字符串类型参数返回对象的指针:

Room::Room* getPointer(const string &nameOfRoom){  
    //I can't use this return statement as the following error  
    //Error: 'this' may only be used inside a nonstatic member function  
    return this; 

编辑(希望是最后一个):
这是返回我正在寻找的东西吗?

Room::Room* getPointer(const string &nameOfRoom){    
    return &Room();  
}

或者它正在返回一个新房间的地址?
谢谢

【问题讨论】:

  • 说真的,你不需要持有对自己的引用,因为你总是隐式地拥有一个 this 指针,真正的问题是你为什么需要这个?
  • 如果你能找到ptrToSelf,你就不需要了。如果你需要它,你怎么知道在哪里寻找它?
  • 如果ptrToSelf是一个实例成员变量,那么表达式ptrToSelf实际上是this->ptrToSelf的简写。因此,如果this 不可用,ptrToSelf 也是如此。我猜这个想法是从一些内部数据结构中按名称查找房间。如果是这样,那么当您找到有问题的房间时,只需返回其地址即可。顺便说一句,你不能写return &Room();。这将创建一个 Room 的临时实例,立即销毁它,然后返回它的地址。
  • 很难再提供帮助,因为我不明白应该如何使用 nameOfRoom 参数。您没有在任何示例代码中使用它,也没有提及您如何在程序中存储房间。

标签: c++ pointers constructor


【解决方案1】:

你不需要这样做,因为你的类会有一个隐式 this 指针

this; // can be called anywhere in your class to access yourself

【讨论】:

    【解决方案2】:

    只需使用隐含的this 参数:

    ptrToSelf = this;
    

    或者,甚至更好(忽略ptrToSelf 是一个相当愚蠢的想法的事实):

    Room::Room() : ptrToSelf(this) { }
    

    编辑: @BenjaminLindley 提请我注意,某些其他成员函数会出现问题。特别是,默认情况下,复制构造函数不会正确运行(ptrToSelf 将简单地从源实例复制,因此两个实例最终都指向一个)。因此,您可能需要提供一个复制构造函数来确保正确分配 ptrToSelf。基本情况是这样的:

    Room::Room(const Room& room) : ptrToSelf(this) { … }
    

    您还需要担心赋值运算符,但只要它只是调用复制构造函数,就可以了。以下通用实现可以解决问题:

    Room& operator=(Room room) { swap(room); return *this; }
    void swap(Room& room) { /* Swap rooms… */ }
    

    (PS:应该是class Room {…,而不是class Room(){…。)

    【讨论】:

    • 感谢您的回复。我也会修改提供的示例。干杯。
    【解决方案3】:

    使用 this 关键字

    ptrToSelf = 这个;

    【讨论】:

      【解决方案4】:

      this 已经是一个指向对象的指针,为什么还需要另一个?我想如果你真的想要它,ptrToSelf = this; 会起作用。

      查看alloftheselinks了解更多信息。

      【讨论】:

        【解决方案5】:

        ptrToSelf = 这个;

        我正在打电话,所以抱歉,如果有必要,稍后会添加详细信息。

        【讨论】:

          【解决方案6】:

          C++ 有一个指向类实例的默认指针。您不仅可以在构造函数中使用this 指针,还可以在实例方法中使用。 看下面的代码摘录:

          class Room {
             public :
                Room(int width); //constructor
                ~Room(); // destructor
          
                //public instance functions
                int getWidth();
                void setWidth (int width);
            private:
                int width;
           };
          
           Room::Room (int width) {
                this->width = width;
           }
           Room::~Room () { }
          
           void Room::setWidth (int width) { 
                this->width = width;
           }
          
           int Room::getWidth () {
               return this->width;
           }
          

          【讨论】:

          • 新手再次提问:当您的width 是公共成员时,使用setWidth 方法的目的是什么?
          • 好吧,我只是在强调这个指针的使用。但是,是的,您通常会将宽度设置为私有/受保护,而不是公共。如果是公开的,则可以直接访问(不使用函数)。
          • 谢谢。我在代码中需要的任何地方都使用了this 指针,因为它更容易(正如您在width 中指出的那样)。干杯
          • 很高兴它有帮助。如果此答案有帮助,请为此投票。
          猜你喜欢
          • 2013-03-07
          • 1970-01-01
          • 2022-11-21
          • 2014-04-10
          • 2018-06-08
          • 2021-04-07
          • 2012-07-30
          • 1970-01-01
          • 2017-07-12
          相关资源
          最近更新 更多