我是C ++的新手,我遇到了这个问题,每当我编译程序时,编译器都会向我投掷。从我到目前为止学到的东西,你有一个类,你可以在其中声明构造函数和函数。然后在课程之后实现这些功能。然后在主要的你打电话/操纵他们。我正在编写一个链接列表程序,但我不断收到这个恼人的编译器错误:
错误:请求
'get_number'
中的成员'test'
,该类型为非类型'LinkList*'
我的原始程序比下面的程序长得多,但是由于我不断得到上述错误,我写了一个非常简单的程序,只是为了看看错误被抛出的位置。尽管写得很简单但我得到了完全相同的错误。所以当我调用我声明并实现的函数时,我做错了。
如果有人能帮助我指出我做错了什么以及为什么我不能称之为该功能:
#include <iostream>
using namespace std;
class LinkList
{
public:
int result;
//declaring the constructor
LinkList(int i);
//declaring simple function
int get_number();
};
//Implementing the constructor
LinkList::LinkList(int i)
{
result = i;
};
//implementing test function
int LinkList::get_number()
{
return result;
}
int main()
{
LinkList *test = new LinkList(5);
int getting_number = 0;
//Error trigger:
test.get_number();
cout<<getting_number;
return 0;
}
答案 0 :(得分:4)
Test是指向LinkList对象的指针,您必须使用箭头操作符( - &gt;)访问测试中的属性和成员,例如:test-&gt; get_number();
或者您可以不创建指向对象的指针并创建普通对象。
答案 1 :(得分:3)
C ++中的对象要么是自动存储,要么是动态存储(还有静态存储,但这超出了问题的范围)
使用new
创建对象时,可以在动态存储中创建它并返回指向它的指针。
使用->
运算符访问指针引用的对象的成员:
test->get_number();
相当于:
(*test).get_number();
您的程序中也存在内存泄漏,因为永远不会释放为test
分配的内存。您需要明确调用delete test
来释放它。 (在这种情况下,它不是实际的内存泄漏,因为系统会在程序出口处回收内存,但您将来应该知道这一点。)
在这种情况下,您应该使用自动存储对象:
LinkedList test(5);
//...
test.get_number();
这样,您不必担心内存管理,也最好使用自动管理对象而不是动态对象。
在c ++中,非pod类型在进入构造函数体之前已初始化,因此您应该开始使用初始化列表:
LinkList::LinkList(int i) :
result(i)
{
};
这可以防止双重初始化,这是一个简单的优化技巧。即使对于这种特殊情况,差异也不明显,你应该开始养成这样早期初始化成员的习惯。
答案 2 :(得分:3)
只需使用
LinkedList test(5);
而不是
LinkList *test = new LinkList(5);
如果您坚持使用新变种,则需要更改
test.get_number();
到
test->get_number();
并在退出函数之前释放(删除)测试对象;
即使这样你也没有将get_number的返回值赋给任何东西,所以你的getting_number变量仍为0;
答案 3 :(得分:0)
test
本身不是LinkList
,而是指向一个test.get_number();
。因此,
test->get_number();
应该是:
(*test).get_number();
这只是以下的捷径:
{{1}}
答案 4 :(得分:0)
错误是正确的。 test
是LinkedList*
,指向LinkedList
的指针。您必须使用test->get_number()
进行调用。点调用仅适用于非指针类型。
答案 5 :(得分:0)
好的,我会说“停在那儿”。这不是Java,也不是C#。这是C ++。在Java和C#中,您始终使用new创建对象。
在C ++中,你并不总是那样创建它们。
您的更好的代码将是:
int main()
{
LinkList test(5);
int getting_number = test.get_number();
std::cout<<getting_number << '\n';
return 0;
}