C ++创建可访问的对象。堆上的运算符?

时间:2011-05-12 22:51:41

标签: java c++

这可能是个愚蠢的问题,但是:

当我从ASM转移到C(不,我实际上并不那么老,我刚开始喜欢在MCU上编程),我喜欢堆内存的使用方式。 Malloc是我的朋友,我很快熟悉了指针。但是...

我转移到OOP和Java。尽管我不喜欢Java作为运行时,但我还是喜欢它的语言。现在,我想结合C的速度和内存管理功能以及OOP的美感。所以我开始学习C ++。

我的问题是,在Java中,我习惯用来访问类成员和函数。运营商。在C ++中,我必须以某种方式使用不那么好且易于键入 - >操作

所以,我的问题是,有什么方法可以使用。运算符而不是 - >访问堆上分配的对象的类成员? Becouse,堆栈是有限的,OOP的真正力量在于动态创建对象。剩下的“差异”就可以了:)。好吧,也许C ++ yould允许你在类中定义类方法,但没有人可以拥有一切,对吧? :D谢谢。

4 个答案:

答案 0 :(得分:5)

Class &c = *c_ptr; // dereference pointer

https://isocpp.org/wiki/faq/references

答案 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只是一个同义词,但我认为后者更容易理解(这就是它存在的原因)。

编辑:或者正如其他帖子所说,只需将解除引用的指针存储在引用中。没想过,因为整个问题有点奇怪。