2012-02-20 31 views
1

私はかなり新しくC++であり、今日まで自分のクラスを作成したことはありません。人々が正常に見直すためのコードを投稿するのは好きではありませんが、締め切りが早いので、コードをコンパイルする必要があります。C++でクラスを作成中にエラーが発生しました

-error:私は3つのエラーを取得する前の宣言よりも `RobotDeadReckoner :: RobotDeadReckoner()スロー() 'この行 で

- 複数のマーカー - エラー:RobotDeadReckoner::RobotDeadReckoner()' throws different exceptions - error: definition of implicitly-declared RobotDeadReckoner :: RobotDeadReckonerの宣言を()'

-error:いいえRobotDeadReckoner::~RobotDeadReckoner()' member function declared in class RobotDeadReckoner」

コードは以下の通りである:

#include <cmath> 
#include "WPILib.h" 


class RobotDeadReckoner 
{//<---------------------Error 
public: 
    float getX(); 
    float getY(); 
    float getHeading(); 
private: 
    Encoder *encoder1;//Encoder1 (Left Transmision while looking from the back) 
    Encoder *encoder2;//Encoder2 (Right Transmision while looking from the back) 
    int wheelRadius;//Wheel Radius (Center Wheel) 
    float axleWidthCenterToCenter; 
    int encoderTicksPerRotation; 
    int transmitionSprocketTeeth; 
    int wheelSprocketTeeth; 
    int ticksPerRotation; //ticks per rotation of wheel 
    float encoderTicks1; 
    float encoderTicks2; 
    float pi; 
}; 

RobotDeadReckoner::RobotDeadReckoner() 
{//<---------------------Error 
    wheelRadius = 4;//Wheel Radius (Center Wheel) 
    axleWidthCenterToCenter = 30+(7/8); 
    encoderTicksPerRotation = 360; 
    transmitionSprocketTeeth = 12; 
    wheelSprocketTeeth = 26; 
    ticksPerRotation = (wheelSprocketTeeth/transmitionSprocketTeeth)*encoderTicksPerRotation; //ticks per rotation of wheel 

    encoderTicks1 = encoder1->Get(); 
    encoderTicks2 = encoder2->Get(); 

    pi = atan(1)*4; 
} 

float RobotDeadReckoner::getX() 
{ 
    float x = wheelRadius*cos(getHeading())*(encoderTicks1+encoderTicks2)*(pi/ticksPerRotation); 
    return x; 
} 

float RobotDeadReckoner::getY() 
{ 
    float y = wheelRadius*sin(getHeading())*(encoderTicks1+encoderTicks2)*(pi/ticksPerRotation); 
    return y; 
} 

float RobotDeadReckoner::getHeading() 
{ 
    float heading = (2*pi)*(wheelRadius/axleWidthCenterToCenter)*(encoderTicks1-encoderTicks2); 
    return heading; 
} 

RobotDeadReckoner::~RobotDeadReckoner() 
{ //<---------------------Error 

} 

私はそれが何かばかげたシンプルだと確信しています。私はC++については分かりませんが、どんな助けもありがとう!

+1

getX()とgetY()の規約では、Xという名前の変数とYという名前の変数があると仮定しています。 – KevinDTimm

答えて

1

definition of implicitly-declared RobotDeadReckoner::RobotDeadReckoner()

これは最も大きなヒントです。 RobotDeadReckoner()のコンストラクタと宣言されていない場合、と定義されているのはです。デフォルトのコンストラクタを指定しないと、コンパイラが自動的にコンストラクタを提供します。したがって、暗黙的に宣言されます。 What is The Rule of Three?を参照してください。

no RobotDeadReckoner::~RobotDeadReckoner()' member function declared in classRobotDeadReckoner'

デストラクタにも同じです。

は、あなたのクラス宣言(のpublic:セクション)に以下を追加します。

RobotDeadReckoner(); 
virtual ~RobotDeadReckoner(); 
+0

ありがとう!私はそれが意味したことを理解していませんでしたが、それを見てそれがかなり明白です... – Jacob9706

+0

@ Jacob9706:助けて幸いです。 StackOverflowへようこそ:) – Johnsyweb

0

あなたが最初のクラス定義でデストラクタ(コンストラクタ)を宣言する必要があります。

class RobotDeadReckoner 
{//<---------------------Error 
public: 
    RobotDeadReckoner(); 
    ~RobotDeadReckoner(); // <--- HERE 
    float getX(); 
    float getY(); 
    float getHeading(); 
private: 
    Encoder *encoder1;//Encoder1 (Left Transmision while looking from the back) 
    Encoder *encoder2;//Encoder2 (Right Transmision while looking from the back) 
    int wheelRadius;//Wheel Radius (Center Wheel) 
    float axleWidthCenterToCenter; 
    int encoderTicksPerRotation; 
    int transmitionSprocketTeeth; 
    int wheelSprocketTeeth; 
    int ticksPerRotation; //ticks per rotation of wheel 
    float encoderTicks1; 
    float encoderTicks2; 
    float pi; 
}; 
1

投稿の最初の部分はクラス定義で、すべてのメンバーの宣言が含まれている必要があります。コンストラクタとデストラクタ。これらはクラス定義には存在しません。

class Robot{ declarations. }; // end of class definition 

次のクラスには、対応する宣言がありません。

RobotDeadReckoner::RobotDeadReckoner() 

また、あなたは.hファイルにクラスを置くべきと.cppファイル内

RobotDeadReckoner::RobotDeadReckoner() 

だからあなたのクラスは次のようになります。

class RobotDeadReckoner{ 
    RobotDeadReckoner(); 
    ~RobotDeadReckoner(); 
etc... 
0

あなたはRobotDeadReckonerコンストラクタやデストラクタでもないと宣言しているので、あなたはさらにRobotDeadReckoner::RobotDeadReckoner()RobotDeadReckoner::~RobotDeadReckoner()とダウン、それらを定義することはできません。クラス宣言内

RobotDeadReckoner(); 
~RobotDeadReckoner(); 

を追加し、さらに下の定義がコンパイルされます。

0

あなただけの、ユーザー定義のコンストラクタとデストラクタの実装を提供することができます

class RobotDeadReckoner 
{ 
public: 
    //declare constructor and destructor 
    RobotDeadReckoner(); 
    ~RobotDeadReckoner(); 
public: 
    float getX(); 
    float getY(); 
    float getHeading(); 
private: 
    Encoder *encoder1;//Encoder1 (Left Transmision while looking from the back) 
    Encoder *encoder2;//Encoder2 (Right Transmision while looking from the back) 
    int wheelRadius;//Wheel Radius (Center Wheel) 
    float axleWidthCenterToCenter; 
    int encoderTicksPerRotation; 
    int transmitionSprocketTeeth; 
    int wheelSprocketTeeth; 
    int ticksPerRotation; //ticks per rotation of wheel 
    float encoderTicks1; 
    float encoderTicks2; 
    float pi; 
}; 

あなたは、コンストラクタやあなたのクラスのデストラクタを宣言しない場合、コンパイラが自動的にデフォルトの1を生成します、これは実装できません。

関連する問題