这可能是个愚蠢的问题,但是:
当我从ASM转移到C(不,我实际上并不那么老,我刚开始喜欢在MCU上编程),我喜欢堆内存的使用方式。 Malloc是我的朋友,我很快熟悉了指针。但是...
我转移到OOP和Java。尽管我不喜欢Java作为运行时,但我还是喜欢它的语言。现在,我想结合C的速度和内存管理功能以及OOP的美感。所以我开始学习C ++。
我的问题是,在Java中,我习惯用来访问类成员和函数。运营商。在C ++中,我必须以某种方式使用不那么好且易于键入 - >操作
所以,我的问题是,有什么方法可以使用。运算符而不是 - >访问堆上分配的对象的类成员? Becouse,堆栈是有限的,OOP的真正力量在于动态创建对象。剩下的“差异”就可以了:)。好吧,也许C ++ yould允许你在类中定义类方法,但没有人可以拥有一切,对吧? :D谢谢。
答案 0 :(得分:5)
Class &c = *c_ptr; // dereference pointer
答案 1 :(得分:1)
不确定。只需获取对堆上(或堆栈,但超出范围)分配的对象的引用:
Object* my_obj_ptr = SomehowGetHeapObject();
Object& my_obj = *my_obj_ptr;
...然后你可以在引用上使用点运算符:
my_obj.Foo();
也许是一个相关的问题,为什么这会让你失望?
答案 2 :(得分:1)
在C ++中,有两种方法可以访问对象的成员,具体取决于您握住对象的方式。如果您直接拥有该对象(或具有对它的引用),则使用点运算符.
。如果有指向对象的指针,则使用指针运算符->
。
考虑:
class C;
...
// creates a new copy of "c" on stack
int f(C c) {
c.something = c.else;
}
// creates a reference to caller's "c"
int f(C& c) {
c.something = c.else;
}
// creates a pointer to caller's "c"
int f(C* p) {
c->something = c->else;
}
所以,你的问题是:你有一个指针,但你不喜欢指针运算符。坦率地说,我并不认为这是一个问题,你应该只使用指针运算符直到你喜欢它。但是,这是SO,所以这是一个解决方案。
从指针初始化引用,并改为使用引用:
int f(C* p) {
C& c = *p;
c.something = c.else; // update the object pointed to by 'p'
}
或者,让它感觉更自然:
int f2(C& c) {
c.something = c.else; // updates f1's object
}
int f1() {
C* p = new C;
f2(*p);
delete p; // don't forget this step!
}
答案 3 :(得分:1)
不,这是不可能的,至少没有一些语法更改。你可以使用(* Pointer).Function,这个Pointer-> Function只是一个同义词,但我认为后者更容易理解(这就是它存在的原因)。
编辑:或者正如其他帖子所说,只需将解除引用的指针存储在引用中。没想过,因为整个问题有点奇怪。