无法通过此 - >指向子对象的指针

时间:2012-04-15 18:16:22

标签: c++ compiler-errors

我知道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 个答案:

答案 0 :(得分: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);

将是正确的版本。

答案 1 :(得分:1)

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

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

一旦有了指针,Child类中的代码就可以根据需要调用my_adult->Whatever()。您需要知道,如果Adult对象始终比Child对象更长,则此方法是安全的。例如,如果删除订单,则也会删除所有订单商品,因此您无需担心订单商品使用指向其订单的无效指针。如果这不是系统中的事情,那么你需要担心的问题比指针语法更大。

答案 2 :(得分:1)

此处的问题是my_adult指针,但hand引用。例如,my_adult=&hand会起作用。

答案 3 :(得分:0)

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