2017-03-03 69 views
1

讓說我有類如何獲得類內的結構?

class A{ 
public: 
    struct stuff{ 
     int x; 
     int y; 
    }; 
    stuff get_stuff(int index){ 
     if(index < vec_stuff.size() && index >= 0) return vec_stuff[index]; 
     else return nullptr; 
    } 
    std::vector<stuff> vec_stuff; 
}; 

假設我適當地填充這些vec_stuff

然後在其他一些類

#inclde "A.h" 
class B{ 
public: 
    B(){} 

    void f(int index, int k){ 

     xxxx = a.get_stuff(index) 
    } 

    A a; // assume A is initialized properly 
} 

所以在我寫xxxx那裏應該是struct stuff的地方,但我這樣做的時候,我得到use of undeclared identifier那麼,如何讓編譯器知道stuff我指的是A.內部

+5

'else return nullptr;'HUH ?? –

+5

'auto'? ------- – Quentin

+1

@WhiZTiM或'auto xxxx = a.get_stuff(index);'。即使使用'private'嵌套結構,這也有利於工作。 –

回答

6

您可以通過使用範圍,運營商指定的全名:

A::stuff xxx = a.get_stuff(index); 

或者,如果你的編譯器支持C++ 11或更高版本可以使用關鍵字auto,讓編譯器弄清楚類型:

auto xxx = a.get_stuff(index); 

補充說明:

get_stuff方法應該不會編譯,因爲它試圖返回一個stuff對象,而nullptr不是一個stuff對象。

stuff get_stuff(int index){ 
    if(index < vec_stuff.size() && index >= 0) return vec_stuff[index]; 
    else return nullptr; 
} 

如果預計有一個值,因此它是一個例外,那麼你應該拋出一個異常。否則,你可以讓它返回一個stuff*,只是返回&vec_stuff[index]

+0

關於'return nullptr'所以我應該只拋出異常呢? – pokche

+0

@pokche取決於你的用例。如果預期有價值,那麼這是一個*例外情況,那麼你應該。否則,你可以讓它返回一個'stuff *',然後返回'&vec_stuff [index];' –

+2

@GillBates:或者一個「可選」包裝器。坦白地說,拋出一個異常是一個合理的,簡單明瞭的方法,無論咒語 –