【问题标题】:How can a class's memory-allocated address be determined from within the constructor?如何从构造函数中确定类的内存分配地址?
【发布时间】:2010-04-27 21:42:19
【问题描述】:

是否可以从类的构造函数中获取新实例化类的内存分配地址?
我正在开发一个链表,其中多个类有多个指向相似类的指针。每次实例化一个新类时,它都需要检查其父类的列表以确保它被包含在内。

如果我尝试做这样的事情:

MyClass() // constructor
{
   extern MyClass * pParent;

   for ( int i = 0; i < max; i++ )
   {
      pParent->rels[i] == &MyClass; // error
   }
}

我收到此错误:

error C2275: 'namespace::MyClass' : 非法使用这种类型作为表达式

任何想法或建议将不胜感激。谢谢。

【问题讨论】:

  • 我很困惑,听起来你想要 this 指针。 . .
  • 梦想,只要回答。我的猜测是,这是一个正确的答案。
  • @dreamlax,谢谢!这正是我一直在寻找的。请添加它作为答案,我会接受它。通常,我为微控制器编写嵌入式 C,因此某些特定于 C++ 的特殊关键字对我来说是新的。
  • 我仍然很困惑你为什么要这样做。为什么新分配的对象的地址在另一个对象(除了一些邪恶的错误)中已经知道?其他实例只能从new 等人获得它构造函数完成之后。

标签: c++ class instantiation


【解决方案1】:

您正在寻找this

【讨论】:

  • 我以为他在找那个。
【解决方案2】:

你的意思是:

pParents->rels[i] = this;

【讨论】:

  • 比较与分配并不重要。我两个都用。谢谢。
  • 请注意,从构造函数传递this 被认为是错误的形式,因为在构造函数退出之前不能保证实例被完全构造。特别警惕涉及虚拟功能(直接或间接)的使用。由于纯虚方法调用,这可能是一条非常快的死亡途径。
【解决方案3】:

如果您编写一个实例方法,例如:

void MyClass::foo(some params);

编译器在传递实例地址的方法中添加了一个特殊参数。你可以想象编译器创建的不是上面的签名,而是这样的:

//this is pseudocode
void MyClass::foo(MyClass * const this, some params);

这是原因之一,例如为什么您不能直接将实例方法作为回调传递。

在任何实例方法的主体中,您都可以使用特殊关键字this作为指向该实例的 const 指针。

静态方法无法获取该指针,因此您不能在其定义中使用 this 关键字。

如果你创建一个像这样的 const 方法:

class MyClass
{
    void foo(some params);
    void foo(some params) const;
}

好像还有第二种方法

//this is pseudocode
void MyClass::foo(const MyClass * const this, some params);

并且编译器可以根据调用方法的对象的常量来做出重载决议

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多