2016-06-20 40 views
2

私はこの作業をどのようにして行うのがうまくいかないのでしょうか?別の良い質問は「構造体パラメータをC++で渡す」です。私のコードがうまくいかない理由を取得してください。ソースファイル構造体をクラスの引数として使用するC++

// A.cpp 

#include "myClass.h" 

int main() 
{ 
    struct myStruct { 
     double a; 
     double b; 
    }; 

    myStruct structName; 
    structName.a = 1.1; 
    structName.b = 2.2; 

    myClass myClassObject(60.0, structName); 

    return 0; 
} 

クラスのヘッダーファイル

// myClass.h 

class myClass { 
    private: 
     double m_value; 
     double m_a; 
     double m_b; 

    public: 
     myClass(double value, struct myStruct); 
     ~myClass(); 
}; 

とクラス定義

// myClass.cpp 

#include "myClass.h" 

myClass::myClass(double S, const myStruct &s): m_value(S), m_a(s.a), m_b(s.b) {}; 
myClass::~myClass(){}; 

を持つ別のソースファイル、私はエラーのすべての種類を取得、のような:私は、すなわち3つのファイルを持っていますmyClassソースファイルでエラーが表示されます。オーバーロードされた関数のインスタンスがありません。 "myClass :: myClass"は指定された型と一致します。私はcppのソースファイルから

struct myStruct 
{ 
    double a; 
    double b; 
}; 

を削除し、MyClassのヘッダー・ファイルにそれを置く場合

は今、すべてのエラーが離れて行きます。

Q)構造体宣言をmyClassヘッダーファイルに入れ、この構造体を定義する唯一の場所にする必要がありますか?これをコーディングする正しい方法ですか?あなたは2つのソリューション持っ

+1

あなたのコンストラクタシグネチャはヘッダとソースで異なります: 'myClass(double value、struct myStruct)'と 'myClass :: myClass(double S、const myStruct&s)' – nikniknik2016

+0

あなたのクラスはmyStructの外観を知る必要があります。それ以外の場合、コンストラクタのシグネチャは不完全であり、コードに変換できません。だから、ヘッダーに定義する必要があります。 – kamikaze

+0

コンパイル出力ログ全体を投稿するのに役立ちます。 'myClass :: myClassは指定された型と一致します。 'というエラーは、コンストラクタを' myClass(double value、struct myStruct) 'と宣言して実装しますが、これは 'myClass :: myClass(double S、const myStruct&s)'と同じです。 –

答えて

4

  1. myClass.h
  2. フォワード
  3. プットの体mystructは、基本的にあなたが誰かが(含んで)読み込み時にすることを確認する必要がありmyClass.h

で体mystructを宣言MYCLASSまた、myStructが存在し、myStructを必要とするすべての人が何らかの方法でアクセスできることも認識しています。

myStructを宣言して転送することはできません。必要な場所に定義することはできません。これは、1つの定義ルールを破るためですが、myClassヘッダーまたは専用ヘッダーに含めることができます。

+0

一般的には、 "structs.h" "commons.h" "enums.h"などのファイルをプロジェクトに含めて、すべての定義を保存することをお勧めします。 – MaciekGrynda

+0

@MaciekGrynda時には、すべてのことを知っているすべてに終わることがあり、データ型がどのクラスのものであるかを伝えるのが難しくなります。カプセル化のルールに従って、可能な限りすべての範囲を制限してください。したがって、ここでは、OPはmyClass.h内の構造体を宣言するだけで済みます(現在のコードはそのままです)。 –

1

ヘッダーにmyStructへの参照とポインタのみを使用している場合は、前方宣言で十分です。その後、

struct myStruct; // < Forward declaration will cause 'incomplete type' error 

class myClass { 
    public: 
     myClass(double value, const struct& myStruct); // < Passing by reference 
     ~myClass(); 
} 

しかし、あなたは、インスタンスを使用して(または値渡し)、コンパイルAnywhereは、あなたが体mystructを使用します。ここで、(それのインスタンスにアクセスする)必要に

// Forward declaration will cause 'incomplete type' error 
#include "myStruct.h" // < Compiler should see full declaration of structure 

class myClass { 
    public: 
     myClass(double value, struct myStruct); // < Passing by value 
     ~myClass(); 
}; 
+0

あなたは 'myClass'コンストラクターが定義されているcppで、' myStruct'の完全な宣言が必要であると言及していません。また、(myStruct')が関数内で宣言されている場合、それは関数ローカルであり、関数の本体の外側には見えません。 –

+0

@ V.Kravchenko構造体のメンバーにアクセスせずに参照とポインタのみを使用している場合は、実際には必要ありません。 – teivaz

0

を定義する構造が必要になりますそれの定義を知っている。

体mystructは、それがmyClass.hでそれを定義するために理にかなっているのMyClassに関連付けられているように見えるので:

// myClass.h 

struct myStruct { 
     double a; 
     double b; 
    }; 

class myClass { 
    private: 
     : 
    public: 
     myClass(double value, struct myStruct); 
     ~myClass(); 
}; 

あなたも、それはMyClassのに固有であるならば、あなたはそれにすることができ、さらに範囲を減らすことができますmyClassのメンバである場合は、フルタイプmyClass::myStructを明示的に使用してアクセスする必要があります。私は、構造体があるクラスに対して非常に限定されているときに、その完全な名前を使用する必要があり、名前空間の競合などを取得しないため、これが好きです。

// myClass.h 

class myClass { 
    public: 
     struct myStruct { 
      double a; 
      double b; 
     }; 

     myClass(double value, struct myStruct); 
     ~myClass(); 
}; 

そして、main.cppに同じようにそれを使用する:あなたは完全なタイプを使用myClass.cppで

// A.cpp 

#include "myClass.h" 

int main() 
{ 
    myClass::myStruct structName; 
    structName.a = 1.1; 
    structName.b = 2.2; 

    myClass myClassObject(60.0, structName); 

    return 0; 
} 

// myClass.cpp 

#include "myClass.h" 

myClass::myClass(double S, const myClass::myStruct &s): 
    m_value(S), 
    m_a(s.a), 
    m_b(s.b) 
{}; 
0

何ソリンは語りました。さらに、クラスを宣言してポインタを使用することもできますが、誤っていない場合は実際の "#include"は必要ありません。

関連する問題