2017-03-03 17 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キーワードを使用し、タイプからコンパイラのフィギュアを聞かせすることができますをサポートしている場合:

あなたget_stuff方法:サイドノートとして

auto xxx = a.get_stuff(index); 

stuffオブジェクトを返そうとしているのでコンパイルすべきではありません。nullptrstuffオブジェクトではありません。

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'に関しては' exception exception'をしなければなりませんか? – pokche

+0

@pokcheあなたのユースケースによって異なります。価値があると予想される場合は、例外的なケースです。さもなければ 'stuff *'を返すようにして、 '&vec_stuff [index];' –

+2

@GillBates:または「オプションの」ラッパーを返すことができます。正直言って例外を投げることは、マントラに関係なく、合理的でシンプルで明確なアプローチです –

関連する問題