在一个开源代码中看到如下内容, 有两个问题:
1. const类型的还可以赋值吗?
2. 上述形式在VS下是有错误的,那么我想在VS下编译,该如何修改
const t_rnxObs* hlp[header.nTypes(sys)]; //主要是这个变量的赋值问题,t_rnxObs是一个结构体,有三个double型变量
for (int iTypeV3 = 0; iTypeV3 < header.nTypes(sys); iTypeV3++) {
hlp[iTypeV3] = 0; //================1.
QString typeV3 = header.obsType(sys, iTypeV3);
QMapIterator<QString, t_rnxObs> itObs(rnxSat.obs);
// Exact match
// -----------
while (itObs.hasNext()) {
itObs.next();
const QString& type = itObs.key();
const t_rnxObs& rnxObs = itObs.value();
if (typeV3 == type2to3(sys, type) && rnxObs.value != 0.0) {
hlp[iTypeV3] = &itObs.value(); //================2.
}
}
// Non-Exact match
// ---------------
itObs.toFront();
while (itObs.hasNext()) {
itObs.next();
const QString& type = itObs.key();
const t_rnxObs& rnxObs = itObs.value();
if (hlp[iTypeV3] == 0 && typeV3 == type2to3(sys, type).left(2) && rnxObs.value != 0.0) {
hlp[iTypeV3] = &itObs.value(); ////================3.
}
}
}
|
20分 |
1.首先这句:const?t_rnxObs*?hlp[header.nTypes(sys)];??是指向const的 指针数组,定义hlp是一个指向t_rnxObs 结构体类型的指针 数组,也就是说这些 指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。
2. VS下编译错误,具体得看什么错误,才能修改。
|
10分 |
|
|
|
|
我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)];
可是1处会提示:
错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换)
请问如何修改
|
|
当你new一个 t_rnxObs对象的时候, 会调用 t_rnxObs的构造函数呀, 出现这个错误的原因是 t_rnxObs类没有提供无参构造函数, 而你没有给 t_rnxObs的构造函数传递参数, 所以会出现这个错误
|
|
1.首先这句:const?t_rnxObs*?hlp[header.nTypes(sys)];??是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。
2. VS下编译错误,具体得看什么错误,才能修改。
我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)];
可是1处会提示:
错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换)
请问如何修改
当你new一个 t_rnxObs对象的时候, 会调用 t_rnxObs的构造函数呀, 出现这个错误的原因是 t_rnxObs类没有提供无参构造函数, 而你没有给 t_rnxObs的构造函数传递参数, 所以会出现这个错误
有无参构造函数:
class t_rnxObs {
public:
t_rnxObs() {
value = 0.0; lli = 0; snr = 0;
}
double value;
int lli;
int snr;
};
|
|
const指针是指地址不能修改,但是地址内存储的数据如果不是const就可以修改
|
|
1.首先这句:const?t_rnxObs*?hlp[header.nTypes(sys)];??是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。
2. VS下编译错误,具体得看什么错误,才能修改。
我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)];
可是1处会提示:
错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换)
请问如何修改
当你new一个 t_rnxObs对象的时候, 会调用 t_rnxObs的构造函数呀, 出现这个错误的原因是 t_rnxObs类没有提供无参构造函数, 而你没有给 t_rnxObs的构造函数传递参数, 所以会出现这个错误
有无参构造函数:
class t_rnxObs {
public:
t_rnxObs() {
value = 0.0; lli = 0; snr = 0;
}
double value;
int lli;
int snr;
};
根据你的错误类型, 可以推测应该是=运算符没有被重载吧, 类对象和类对象赋值是需要重载=运算符的.
没有完整的代码, 只能给你分析到这里了
|
10分 |
const位置不同表示的意思是不同的,有可能是指向的地址是 常量,也可能是指向地址中的内容是 常量,还可能两个都是
具体看下面:
const & 指针
类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?
1)、const在前面
const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可变
const (char *) pContent;//pContent是const,*pContent可变
char* const pContent; //pContent是const,*pContent可变
const char* const pContent; //pContent和*pContent都是const
2)、const在后面,与上面的声明对等
int const nValue; // nValue是const
char const * pContent;// *pContent是const, pContent可变
(char *) const pContent;//pContent是const,*pContent可变
char* const pContent;// pContent是const,*pContent可变
char const* const pContent;// pContent和*pContent都是const
答案与分析:
const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:
当const所在代码段中不包含括号时,沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。
另外,需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这时限定指针是const。
一个简单的判断方法:指针运算符*,是从右到左,那么如:char const * pContent,可以理解为char const (* pContent),即* pContent为const,而pContent则是可变的。
|
|
A1.编译器只让你赋值一次,但是采用指针,能间接操纵
|
|
1.首先这句:const?t_rnxObs*?hlp[header.nTypes(sys)];??是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。
2. VS下编译错误,具体得看什么错误,才能修改。
我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)];
可是1处会提示:
错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换)
请问如何修改
当你new一个 t_rnxObs对象的时候, 会调用 t_rnxObs的构造函数呀, 出现这个错误的原因是 t_rnxObs类没有提供无参构造函数, 而你没有给 t_rnxObs的构造函数传递参数, 所以会出现这个错误
有无参构造函数:
class t_rnxObs {
public:
t_rnxObs() {
value = 0.0; lli = 0; snr = 0;
}
double value;
int lli;
int snr;
};
根据你的错误类型, 可以推测应该是=运算符没有被重载吧, 类对象和类对象赋值是需要重载=运算符的.
没有完整的代码, 只能给你分析到这里了
如下编译OK的啊,检查下你定义的数组维数:
#include “stdafx.h”
class t_rnxObs{
public:
t_rnxObs(){
value = 0.0; lli = 0; snr = 0;
}
double value;
int lli;
int snr;
};
int _tmain(int argc, _TCHAR* argv[])
{
const t_rnxObs* hlp=new t_rnxObs[5];
return 0;
}
|