2016-12-06 14 views
-3

構造体に慣れていません。 TEST.HでヘッダーファイルのC++構造体

: は、しかし、私はこれを作成し

class test { 
public: 
    struct Astruct 
    { 
     int age; 
     int weight; 
    }; 
    struct Astruct& MethodOne(); 
}; 

とTEST.CPPで

#include "test.h" 
test::test() {} 
struct Astruct& test::MethodOne() { 
    Astruct testStruct; 
    // code to fill in testStruct 
    return testStruct; 
} 
上記のこのコードの目的は、私が返すことができるよということです

structMethodOne

しかし

struct Astruct & test::MethodOne(){ 

の行にそれは言う:エラー:宣言はヘッダファイルに何があるかとの互換性がありません。

私はこれを理解していません。構造体をintの戻り値の型に置き換えるとエラーはありませんか? ここに何が問題なのですか?

そして、私はtestStructを返すとき、私は取得しています2番目のエラー:エラー:タイプの参照「Astruct &」(資格のconstではないが)型の値で初期化することができません「テスト:: Astruct」

+3

クラシック1を:あなたは、一時的に参照を返します。警告を有効にしてコードをコンパイルする方法を学び、コンパイラの指示に従ってください。 – YSC

+2

Cの本から学んだように、 'struct'の使い方が分かります。 C++では 'class'と' struct'の間に違いがないことだけを知る必要があります。そして2番目に知っておくべきことは、 'class'のデフォルトのアクセス指定子は' private'ですが 'struct'では' public'ですが、実際には唯一の違いです – user463035818

+2

'struct test :: Astruct&test :: MethodOne(){'、クラスの名前空間を使用します。あなたが持っている3番目のエラーは "一時的な参照を返す"です。参照を戻り値にドロップします。 –

答えて

3

コードにいくつかのエラーがあります(;などがありません)。 classは、C++のstructと異なります。唯一の違いは、のprivatestruct(メンバーと継承)のpublicのデフォルトのアクセス指定子です。

構造体は、通常、ロジックまたはメソッドのないデータ構造体であることを示すために使用されます。 Imho彼らはメソッドの入力と出力をカプセル化するのがいいです。私は、構造体は、クラス内で宣言されているので、Foo:BarOutFoo::BarInを書かなければならなかった

class Foo{ 
    public: 
    struct BarIn {};    // need ; here 
    struct BarOut {};    // and here 
    BarOut bar(const BarIn& b){return BarOut();} 
}; 


int main() { 
    Foo::BarOut result = Foo().bar(Foo::BarIn()); 
} 

注:メンバ関数のためにそれを持っているしたい場合は、次のようになります。 struct(実際にはclassまたはstructのインスタンス間に違いがないため)structと宣言された型の変数を宣言するときには、structを書く必要はありません。

なく、少なくとも最後に、あなたはローカル変数への参照(またはポインタ)返さないん:

struct Astruct & test::MethodOne(){ 
    Astruct testStruct; 
    return testStruct;   // testStruct is destroyed here 
}         // and the returned ref is invalid 
関連する問題