2010-04-16 91 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; 
相關問題