有人封裝過GMP庫嗎?这样的情况該怎麽办。謝謝

WorldCreater 2011-09-22 06:15:00


class TGMP {
public:
const mpz_t& getValue(); // return this->value; // 由於 mpz_t 類型是一種數組類型,c++中不能返回數組類型,
//所以只好用 const 限制,防止被人通過 a = b.getValue(); 方式获得引用,从而从外部更改類内部的私有变量
TGMP(); //------init value field here
virtual ~TGMP(); //------destory value field here
TGMP& operator = (const TGMP&); // this operator is passed
TGMP operator + (const TGMP&); // this operator is passed
......
bool operator == (const TGMP&); // here is error ??? it
cannot set to "const"
protect:
private:
mpz_t value;
}

===================
implement:

bool TGMP::operator == (const TGMP& o) {
if (mpz_cmp(value, o.getValue())==0) { //--------------error 
return true;
} else {
return false;
}
}

=========================
TGMP.cpp|94|error: passing ‘const TGMP’ as ‘this’ argument of ‘const
__mpz_struct (& TGMP::getValue())[1]’ discards qualifiers|

...全文
118 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
纸箱猪 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 worldcreater 的回复:]

C/C++ code

int main() {
const TGMP ddd;
ddd.getValue();////////这样也是不能調用的
}
只有在函數參數時 (詳細代碼如上述篇首的運算符重載代碼)
void xxx( const TGMP& o) {
o.value 可以使用
o.getValue() 不能使用
}
[/Quote]

你定义了一个const的TGMP对象,当然不能使用它的非const成员函数,把getValue()定义为 getValue() const; 就可以使用了。


至于为什么在xxx函数里可以使用o.value,要么是因为xxx本身就是TGMP的成员函数,要么是因为value数据成员是public的,你的情况应该属于前者。
纸箱猪 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 worldcreater 的回复:]

C/C++ code

int main() {
const TGMP ddd;
ddd.getValue();////////这样也是不能調用的
}
只有在函數參數時 (詳細代碼如上述篇首的運算符重載代碼)
void xxx( const TGMP& o) {
o.value 可以使用
o.getValue() 不能使用
}
[/Quote]

你定义了一个const的TGMP对象,当然不能使用它的非const成员函数,把getValue()定义为 getValue() const; 就可以使用了。

至于为什么在xxx函数里可以使用o.value,要么是因为xxx本身就是TGMP的成员函数,要么是因为value数据成员是public的,你的情况应该属于前者。
纸箱猪 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 worldcreater 的回复:]


醒來試了下,

mpz_clear(a.value);////////这句編譯是通不過的……

gmp_printf("%Zd", ddd.value); //////這樣編譯也是通不过

[/Quote]

那是当然的,因为你这两条语句是写在main函数里的,也就是写在TGMP函数外面的。

但是如果你定义一个TGMP成员函数如下:

void TGMP::memFun(TGMP &o);

那么在TGMP::memFun里是可以使用o.value的。
WorldCreater 2011-09-23
  • 打赏
  • 举报
回复

int main() {
const TGMP ddd;
ddd.getValue();////////这样也是不能調用的
}
只有在函數參數時 (詳細代碼如上述篇首的運算符重載代碼)
void xxx( const TGMP& o) {
o.value 可以使用
o.getValue() 不能使用
}
WorldCreater 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zzxiang1985 的回复:]
private的可视性隐藏只对其它类有效。o.value = x; 也的确是有效的。C++的设计也的确富有争议性。如果楼主一直习惯的是Delphi或Java的语言设计,可能是会对C++的规范不太习惯。
[/Quote]
醒來試了下,

int main() {
TGMP a;
mpz_clear(a.value);////////这句編譯是通不過的

const TGMP ddd;
gmp_printf("%Zd", ddd.value); //////這樣編譯也是通不过
}

这样看來它的隐藏性是没問題的
那么,應該是證實了我上面說的
---------
当把參數設成 const 後,也不怕有人試圖更改私有字段値了,
索性讓人可以直接調用字段値,同時禁用成员函數;;
---------
g++編譯
纸箱猪 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 worldcreater 的回复:]

不理解:
我把 某个字段放在 private 部
如果照你这么說,
这种 private 等可视性隐藏就没用了?

比如上述的 o.value = x ; 可以这样赋值?
////如果这样,c++ 的这种設計可是极其失敗的

或者,我刚有了个理解,当把參數設成 const 後,也不怕有人試圖更改私有字段値了,
索性讓人可以直接調用字段値,同時禁用成员函數;;

總覺得C+……
[/Quote]

private的可视性隐藏只对其它类有效。o.value = x; 也的确是有效的。C++的设计也的确富有争议性。如果楼主一直习惯的是Delphi或Java的语言设计,可能是会对C++的规范不太习惯。

纸箱猪 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 worldcreater 的回复:]

"类的成员函数中总是可以直接使用相同类的对象的数据成员(即你说的私有字段)的,这和const没有关系。"

——————在这里,我覺得你看錯了:
那是在參數中傳入的對象!!!!!!!1
而不是自己的成員函數訪問自己的値!!!
所以正常來說,在这样的情况 void xxx (classtype a); 是不能 a.value 这样使用 a 在 private 部的字段的
[/Quote]

没看错,即使是传入的参数,只要是同样的类,就可以操作它的私有成员。楼主不妨写一个小程序自己试验一下。
WorldCreater 2011-09-22
  • 打赏
  • 举报
回复
"类的成员函数中总是可以直接使用相同类的对象的数据成员(即你说的私有字段)的,这和const没有关系。"

——————在这里,我覺得你看錯了:
那是在參數中傳入的對象!!!!!!!1
而不是自己的成員函數訪問自己的値!!!
所以正常來說,在这样的情况 void xxx (classtype a); 是不能 a.value 这样使用 a 在 private 部的字段的
WorldCreater 2011-09-22
  • 打赏
  • 举报
回复
不理解:
我把 某个字段放在 private 部
如果照你这么說,
这种 private 等可视性隐藏就没用了?

比如上述的 o.value = x ; 可以这样赋值?
////如果这样,c++ 的这种設計可是极其失敗的

或者,我刚有了个理解,当把參數設成 const 後,也不怕有人試圖更改私有字段値了,
索性讓人可以直接調用字段値,同時禁用成员函數;;

總覺得C++有點怪怪的,,,
"分号前加const表示该成员函数不会修改this指针所指向的对象的数据成员。"
指的是參數吧?個人以為還是在參數定義時加 const 更加清晰直觀

纸箱猪 2011-09-22
  • 打赏
  • 举报
回复
类的成员函数中总是可以直接使用相同类的对象的数据成员(即你说的私有字段)的,这和const没有关系。

分号前加const表示该成员函数不会修改this指针所指向的对象的数据成员。

搂主,这些可是C++的基础知识。
WorldCreater 2011-09-22
  • 打赏
  • 举报
回复
那個value是私有字段
getValue() 是成员函數
參數定義成 const 後,成员函數就不能調用了,但是居然能直接調用私有字段了
-------------
另,分号前加 const 是什么意思啊
纸箱猪 2011-09-22
  • 打赏
  • 举报
回复
把getValue()的定义换成如下形式试试看:

const mpz_t& getValue() const; // 分号前面加上const

TGMP的重载操作符“+”接收的参数o是常量引用,因此只能调用o的const成员函数,以保证o的数据成员不会被修改。
纸箱猪 2011-09-22
  • 打赏
  • 举报
回复
噢,我可能知道了。把getValue()的定义换成如下形式试试看:

const mpz_t& getValue() const; // 分号前面加上const

TGMP的重载操作符“+”接收的参数o是常量引用,因此只能对调用o的const成员函数,以保证o的数据成员不会被修改。
纸箱猪 2011-09-22
  • 打赏
  • 举报
回复
把mpz_add的函数声明贴出来。

o.value当然可以在这里调用,因为o是TGMP对象,这个函授又是TGMP成员函数。C++标准就是这么规定的。
WorldCreater 2011-09-22
  • 打赏
  • 举报
回复
而且,我發現 c++ 有點奇怪

o.value 是私有变量
但在這個加號符重載中居然能調用

TGMP TGMP::operator + (const TGMP& o) {
TGMP r;
mpz_add(r.value, this->value, o.value);
return r;
}


WorldCreater 2011-09-22
  • 打赏
  • 举报
回复
bool TGMP::operator == (const TGMP& o) {
if (mpz_cmp(value, o.getValue())==0) { //--------------error 
return true;
} else {
return false;
}
}

是因為 參數是 const 的原因, const 定義參數後,就不能調用 o.getValue() 了
纸箱猪 2011-09-22
  • 打赏
  • 举报
回复
TGMP::getValue()这个成员函数的定义本身应该是没什么问题的,把TGMP.cpp文件的94行贴出来看看,可能是调用的地方有问题。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧