2015-03-19 36 views
3

我覺得這應該是簡單的,但無論出於什麼原因我都無法使它工作。從'Class *'沒有可行的轉換到'Class'C++

我試圖創建一個類的實例,可以傳入並由其他函數直接編輯。

例如:

main() 
{ 
    ClassFoo foo = new ClassFoo(); 
    someFunction(foo); 
} 

void someFunction(ClassFoo& f) 
{ 
    f.add("bar"); 
} 

問題是,編譯時,我結束了這個錯誤。

no viable conversion from 'ClassFoo *' to 'ClassFoo' 
    ClassFoo foo = new ClassFoo(); 
      ^ ~~~~~~~~~~~~~~~ 

它還說,其他候選構造是不可行的,但是在我的ClassFoo類我有一個構造函數,看起來像這樣:

ClassFoo::ClassFoo() 
{} 

所以,我怎麼就能夠完成編輯ClassFoo函數變量?

回答

8

C++不是Java(或C#我想)。除非您使用know that you need to,否則絕不應使用new關鍵字。它會返回一個指向新創建的類的指針,因此會出現錯誤。可能的是,以下就足夠了:如果你不使用new,因爲這會產生完全不同的

Class foo; 
someFunction(foo); 

對於默認構造的對象,你不應該包括()(見the most vexing parse

+0

當您需要在現代C++中使用'new'時,唯一的時候是爲智能指針指定自定義刪除器。 +1 – vsoftco 2015-03-19 02:45:23

+0

謝謝你。任何想法爲什麼當退出程序(只在主要返回0)時,它說'被釋放的指針沒有被分配'? – Alex 2015-03-19 03:08:03

+0

@Alex這意味着某個地方有一個'delete'調用,它試圖刪除那些未用'new'分配的東西。參見:http://stackoverflow.com/questions/22824802/malloc-error-for-object-pointer-being-freed-was-not-allocated-set-a-br。但是,除非你真的知道你需要它,否則「新」不應該出現,也不應該「刪除」。 – aruisdante 2015-03-19 03:15:30

3

你可能使用C#或類似sintax ..

然而,在C++中,有這些線路之間的巨大差異:

ClassFoo foo; //local variable at stack 
ClassFoo *foo = new ClassFoo(); //local pointer to some memory at heap which is structured like ClassFoo 

您可能需要第一行來創建本地對象。 有許多教程描述了堆和棧之間的區別..所以檢查它們

相關問題