为什么指向对象的指针不能按预期工作?

问题描述

因此,我将粘贴在代码中发现的异常情况,而不是粘贴大量的代码

假设我们有一堂课,比如L。

#include <R.h>
class L 
{
public:
    string name;
    L(string L_name)
    {
        name = L_name;
        R.addMe(this); // call R's addMe method with the 'this' pointer as an argument.
    }
}

让我们定义类R。

class R
{
private:
    vector<L*> vector_of_ls; // a vector containing pointers to objects of type L.
public:
    void addMe(L* l)
    {
        vector_of_ls.push_back(l);
    }

    void printLName()
    {
        for(unsigned int i =0; i<vector_of_ls.size(); i++)
        { cout<<l->name<<"\n"; } // print the name data member of an L object.
    }
}

现在我们已经有了L和R类,让我们在另一段代码中创建L类型的对象。

// Main
int main()
{
    R* r = new R();

    L l1 = L("hello");
    // do stuff
    R->printName();
}

输出:您好

总而言之,我定义了两个类L和R。 所有类型L的对象都将具有名称,并且其构造函数将对其进行设置。构造函数还在另一个名为addMe(L * l)的类R中调用一个函数。此函数只是将指向L型对象的指针推入向量中。类R还包含一种方法,用于打印存储在其向量中的所有L个对象的名称

我在定义为“ // Main”的最后一段代码中实现了所有这些功能

一切正常且安静。但是,在main()的定义中,如果我更改了此内容

// Main
int main()
{
    R* r = new R();

    L* l1 = &L("hello"); //L l1 = L("hello");
    // do stuff
    R->printName();
}

它不起作用,正如我期望的那样。我这次所做的只是创建一个L类型的对象并将其位置存储在指针中。发生的是,R-> printName()现在将打印空字符串。

这似乎很奇怪。我还没有注意到的东西很明显吗?

我是c ++的新手,对此我将不胜感激。

谢谢, s。

解决方法

您弄乱了类型和变量。 R是一个类,它是一种类型。 r是一个变量。因此,R.addMe()R->printMe()在c ++中是非法的。您不能要求它调用类型(类)的任何成员。您只能对对象(变量)执行此操作。

因此,首先您需要声明一个R类型的变量。它可能是对象本身或指向它的指针。

  R myObj; // is an object of type R.

现在您可以要求它添加:myObj.addMe()

它可能是一个指针:

   R *r = new R();

现在您可以说r->printMe();

在以上示例中,myObjr是完全不同的实体。 r指向与myObj不同的对象。因此,添加到myObj的任何内容都不会反映在r所指向的内容中。

还请注意,在使用对象的任何成员之前,该对象的声明必须可见。它可以在全局范围内声明,也可以作为参数传递给函数。