问题描述
因此,我将粘贴在代码中发现的异常情况,而不是粘贴大量的代码。
假设我们有一堂课,比如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()
;
在以上示例中,myObj
和r
是完全不同的实体。 r
指向与myObj
不同的对象。因此,添加到myObj
的任何内容都不会反映在r
所指向的内容中。
还请注意,在使用对象的任何成员之前,该对象的声明必须可见。它可以在全局范围内声明,也可以作为参数传递给函数。