2015-05-17 166 views
-2

我試圖在我的類中聲明struct,然後使用該類中的成員函數將指針 返回到struct,但它不起作用。C++返回指向函數結構的指針

這裏是我的代碼:

someClass.h:

class someClass 
{ 
public:   
    someClass(); 
    sword* returnSword();   

    struct sword 
    { 
     int str; 
     char name; 
    }; 

    sword* m_sword; 
}; 

someClass.cpp:

#include "someClass.h" 

someClass::someClass() 
{ 
    m_sword = new sword; 

    m_sword->name='s'; 
    m_sword->str=5; 
} 


someClass::sword* someClass::returnSword() 
{  
    return m_sword;  
} 

在情況下,如果我的代碼是總廢話,請解釋一下我怎麼能有在我的類中的結構,初始化它,然後返回指向該結構的類的指針。

謝謝。

+7

定義「不起作用」。會發生什麼,以及你希望發生什麼不同?我沒有看到你顯示的代碼中有任何明顯的錯誤。 –

+0

那麼如果我嘗試編譯,它給了我一堆錯誤,但即使之前, 在功能returnSword()函數名的初始化紅色突出顯示了下文。 聲明是與不兼容的 「 * SomeClass的:: returnSword()」 – user1335175

+3

移動的高於returnSword'的'聲明的'sword'定義。這似乎很不必要的動態分配一個'sword',如果你這樣做,那麼你的類需要遵循【三規則(https://stackoverflow.com/q/4172722/241631)。 – Praetorian

回答

1

sword* returnSword(); 

是一個問題。 sword不知道該行。在該行之前移動sword的定義或提供前向聲明。

class someClass 
{ 
public:   
    someClass(); 

    struct sword 
    { 
     int str; 
     char name; 
    }; 

    sword* returnSword();   


    sword* m_sword; 
}; 

class someClass 
{ 
public:   
    someClass(); 

    struct sword; 

    sword* returnSword();   

    struct sword 
    { 
     int str; 
     char name; 
    }; 

    sword* m_sword; 
}; 
4

總是發佈你得到的編譯錯誤。在這種情況下:

error: 'sword' does not name a type 
    sword* returnSword(); 
^

確定。爲什麼不sword命名一個類型?因爲它還沒有被宣佈。您必須聲明sword你所做的任何引用之前:

class someClass 
{ 
public:   
    struct sword // <== must be declared 
    { 
     int str; 
     char name; 
    }; 

    someClass(); 
    sword* returnSword(); // <== before you use it 
    // ... 
}; 

儘管你真的需要m_sword是一個指針?可以讓它成爲一個值,並且returnSword()返回一個參考。這樣,你不能忘記delete它在你沒有寫析構...

0

使用着劍的聲明是另一種方式來解決這個問題。

class someClass 
{ 
public:   
    someClass(); 
    struct sword; // FORWARD declaration for sword 
    sword* returnSword();   

    struct sword 
    { 
     int str; 
     char name; 
    }; 

    sword* m_sword; 
};