2010-04-16 86 views
0

我有一个名为extBlock的类。错误C2440:'初始化':无法从'classname *'转换为'classname'

然后我让那个类的一个实例与此

extBlock mainBlock = new extBlock(1, 1024); 

我得到这个错误: 错误C2440: '初始化':无法从 'extBlock *' 到 'extBlock'

转换灿任何人都可以帮我解释为什么我得到这个错误。

我看到在线的例子用指针声明像这样

extBlock *mainBlock = new extBlock(1, 1024); 

但如果我这样做,这样它不会让我叫mainBlock

的功能
+0

你应该把你的代码放在一个新的行,并缩进每一个有四个空格。 – 2010-04-16 16:25:05

+5

您可能会参考此问题中列出的介绍性C++书籍之一:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – 2010-04-16 16:26:15

+0

http:// stackoverflow的可能重复。 COM /问题/ 2647660 /创建-的-AN-对象在-C – 2010-04-16 16:28:23

回答

7

这是不是C# :new extBlock返回指向extBlock的指针,并且您试图将该指针指定给值类型(这将是不兼容的强制转换)。

你想在这里写的是

extBlock mainBlock(1, 1024); 

,你不能呼吁第二代码片段的方法的原因可能是因为你正在使用的不是所需要的->arrow)运算符.操作取消引用指针。

13

阅读上你的C++语法:

extBlock mainBlock(1, 1024); // create a class instance (object) on the stack 
mainBlock.memberFunction(); // call a member function of a stack object 

extBlock * ptrBlock = new extBlock(1, 1024); // create an object on the heap 
ptrBlock->memberFunctions(); // member access through pointers has different syntax 
delete ptrBlock; // must deallocate memory when you're done with a heap object 
1

你要这个,就像你有:

extBlock *mainBlock = new extBlock(1, 1024); 

但然后调用使用->代替.功能,像这样:

mainBlock->FunctionOnIt(...); 

不要忘了在不再需要时删除它。

delete mainBlock; 
0

new关键字总是分配给指针。你需要做的是这样的:

extBlock *mainBlock = new extBlock(1, 1024); 
mainBlock->functionName(); 

由于mainBlock现在是一个指针,.运营商将不再工作,以参考字段或方法和->运营商必须在其位置上使用。

1

new返回一个指向已分配内存的指针,其中构造函数已初始化您的对象。因此您需要使用extBlock *mainBlock = new extBlock(1, 1024);。您可以通过mainBlock->someMethod()(*mainBlock).someMethod()之后调用方法。

9

从Java/C#切换?

在C++中,初始化堆栈的对象,你只需要使用

extBlock mainBlock (1, 1024); 
... 
mainBlock.call_func(1,2,4,7,1); 

new运算符创建于堆中的对象,指针返回到它。为了从一个指针访问功能,你需要取消对它的引用与*

extBlock* mainBlock = new extBlock(1,1024); 
... 
(*mainBlock).call_func(1,2,4,7,1); 

在C和C++,a->b可以就地使用(*a).b

mainBlock->call_func(1,2,4,7,1); 

此外,C++没有垃圾收集默认情况下,所以你需要明确地与delete释放:

delete mainBlock; 
相关问题