好吧,它非常基本但我放弃了。我只是想检查一个问题的答案: compilator会抗议吗?
cell->unregister();
cell.erase();
所以我用c ++编写了一个最简单的脚本来检查:
/*
* main.cpp
*
* Created on: Aug 7, 2014
* Author: luke
*/
#include <iostream>
#include <cstdlib>
using namespace std;
class abs
{
int a,b;
public:
void unregister(){
a = 0;
b = 0;
}
void erase(){
a = 2;
b = 0;
}
abs(int c,int d);
};
abs::abs(int c,int d){
a = c;
b = d;
}
int main () {
abs obj(4, 2);
obj->unregister();
obj.erase();
}
我得到的错误是:
描述资源路径位置类型语句无法解析 重载函数main.cpp /测试行32的地址C / C ++问题
描述资源路径位置类型方法&#39;取消注册&#39;不能 解决main.cpp /测试行34语义错误
描述资源路径位置类型方法&#39;擦除&#39;不可能 已解决的main.cpp /测试行35语义错误
描述资源路径位置类型make: * [main.o]错误 1测试C / C ++问题
描述资源路径位置类型预期';'之前 'obj'main.cpp /测试行32 C / C ++问题
描述资源路径位置类型'obj'未在此声明 范围main.cpp /测试行34 C / C ++问题
答案 0 :(得分:2)
它应该是obj.unregister();
,因为obj是一个实际的对象而不是指向对象的指针。
答案 1 :(得分:2)
是的,编译器应该抗议这一行:
obj->unregister();
' - &gt;'运算符与指针一起使用,而这里不是。它应该是:
obj.unregister();
答案 2 :(得分:2)
obj
不是指针,因此->
运算符不会对其起作用。请改用.
:
obj->unregister();
答案 3 :(得分:2)
你有两个问题:
1) abs
是C standard function,您在#include <cstdlib>
时将其包含在您的计划中。您的班级abs
的名称与此功能相冲突。
2) obj->unregister
应该是obj.unregister()
,因为obj
是一个对象,而不是一个指针。
<强>解决方案:强>
abs
namespace
中声明。答案 4 :(得分:2)
正如您所看到的,编译器确实提出了抗议。
->
在这里不起作用。 obj->unregister();
是(*obj).unregister();
的简写
它在堆上初始化对象时起作用,链接此
abs1 * obj = new abs1(4, 2);
obj->unregister(); // obj.unregister(); will not work
obj->erase();
您在堆栈上初始化了对象;所以 - &gt;不会工作只有“。”会工作:
abs1 obj(4, 2);
obj.unregister(); // obj->unregister(); will not work
obj.erase();
更新:我更新了示例以使用与系统函数相同的名称更正abs
的问题,在其他答案中指出。
答案 5 :(得分:1)
主要有两个问题:
这将解决两个问题:
int main () {
class abs obj(4, 2);
obj.unregister();
obj.erase();
}
答案 6 :(得分:1)
该程序有两个错误。
首先,以与函数名称相同的方式命名类是一个坏主意。
您包含标题<cstdlib>
,其中包含标准C函数abs
的声明。此函数名称隐藏了类abs。
要解决此问题,您必须在语句
abs obj(4, 2);
那就是你必须写
class abs obj(4, 2);
第二个错误是使用成员访问运算符->
而不是。那就是你必须写
obj.unregister();
而不是
obj->unregister();