1

我知道this已经是一个指针,但我想了解究竟this是什么。它是地址还是 * 类型的指针?

如果我要将它存储到一个变量中,我将如何定义该变量?

让我们以此为例

class Adult
{
private:
 Child child;

public:
 Adult(){
  child = new Child(this);
  //to have something to hold onto and get back to the upper level of the hierarchy.
 }
};


class Child
{
private:
 Adult* my_adult;

public:
 Child();
 Child(Adult &hand){
  my_adult = hand;
 }
}

好的,所以我遇到问题的地方是my_adult = hand; 当我尝试构建项目时它输出的代码行,如果后面还有更多,我会感到非常震惊。

sys/chin.cpp:19:14: error: cannot convert ‘Adult’ to ‘Adult*’ in assignment

那么,当作为与访问成员相反的数据类型处理时,这是如何工作的呢?

4

4 回答 4

3

my_adult是指针,hand不是,纯粹而简单。

您要么需要:

class Child
{
private:
 Adult my_adult; //no pointer

public:
 Child();
 Child(Adult &hand){
  my_adult = hand;
 }
};

或者

class Child
{
private:
 Adult* my_adult;

public:
 Child();
 Child(Adult* hand){ //pointer parameter
  my_adult = hand;
 }
};

你的第一个例子也是非法的:

child = new Child(this);

不应该编译,因为 child 是一个对象,而不是一个指针。

child = Child(this);

将是正确的版本。

于 2012-04-15T18:18:41.657 回答
1

地址和 * 类型指针是一回事。更改您的 Child 构造函数以使用Adult*并使用初始化语法进行初始化,而不是=

Child(Adult* hand): my_adult(hand) { } 

一旦你有了那个指针,你的 Child 类中的代码就可以my_adult->Whatever()根据需要调用。您需要知道,这种方法只有在Adult对象总是比Child对象更长寿时才是安全的。例如,如果一个订单被删除,那么所有的订单项目也会被删除,因此您不必担心订单项目使用了指向其订单的无效指针。如果这不是您系统中的情况,那么您需要担心的问题比指针语法更大。

于 2012-04-15T18:19:34.730 回答
1

这里的问题是,它my_adult是一个指针,但却hand是一个引用my_adult=&hand例如,会起作用。

于 2012-04-15T18:19:49.533 回答
0

您正在尝试将对象分配给指针。不起作用。此外,儿童必须在成人之前定义。否则,必须将 Adult 定义为 Child 作为指针(和前向声明)。

于 2012-04-15T18:20:13.777 回答