1

次のクラスと対応するヘッダー ファイルがあります。

#ifndef ORDER_H_
#define ORDER_H_

#include "Side.h"

using namespace std;

class Order {
public:
    int _id;
       Side _side;
       int _ackedPrc;
       int _ackedQty;
       int _requestedPrc;
       int _requestedQty;
       int _filledQty;

       Order(){
           _id = -1;
           _side = BID;
           _ackedPrc = -1;
           _ackedQty = 0;
           _requestedPrc = 0;
           _requestedQty = 0;
           _filledQty = 0;
       }
       void cancel(){
           _requestedQty = 0;
       }
       void amend(int prc, int qty){
           _requestedPrc = prc;
           _requestedQty = qty;
       }
       void amended(){
           _ackedPrc = _requestedPrc;
           _ackedQty = _requestedQty;
       }
       void acked(){
           amended();
       }
       void onFill(int fillQty){
           _filledQty += fillQty;
       }
       int filledQty(){
           return _filledQty;
       }
       int prc(){
           return _requestedQty;
       }
       int remainingQty(){
           return _requestedQty - _filledQty;
       }
       int id(){
           return _id;
       }
       Side side(){
           return _side;
       }
       bool pendingMod(){
           return _ackedPrc != _requestedPrc || _ackedQty != _requestedQty;
       }

};
#endif

#ifndef ORDER_H_
#define ORDER_H_
#include "Side.h"

class Order {
public:
    int _id;
    Side _side;
    int _ackedPrc;
    int _ackedQty;
    int _requestedPrc;
    int _requestedQty;
    int _filledQty;

    Order();
    void cancel();
    void amend(int prc, int qty);
    void amended();
    void acked();
    void onFill(int fillQty);
    int filledQty();
    int prc();
    int remainingQty();
    int id();
    Side side();
    bool pendingMod();
};

#endif /* ORDER_H_ */

このオブジェクトをインスタンス化しようとすると、Mac の CDT/Eclipse で symbol(s) not found エラーが発生します。ただし、プロジェクト内の他のクラスを簡単にインスタンス化できるため、問題は Order クラスにあると確信しています。

int main() {
   Order o;//This gives me an error
//   OrderBook ob; But this works
//   QuoteBook qb; And this works
    return 0;
}

誰でも私の問題を見つけることができますか? どこかで私の宣言がどこかで私の定義と一致しないと考え続けていますが、その方法がわかりません。(そして、はい、私は C++ 初心者です。ベスト プラクティス違反はご容赦ください。)

ありがとう

4

1 に答える 1

1

もしかしてJavaプログラマー?コードを見ると、実際にはクラスを 2 回宣言しています。OrderC++ では通常、クラスを宣言してから、その中でメンバー変数と関数を定義します。実際には、 の最初の宣言のように 1 つで宣言および定義できますがOrder、コードが非常に短い場合を除き、通常は良い方法ではありません。いずれにせよ、ヘッダーは次のようにすることをお勧めします。

#ifndef ORDER_H_
#define ORDER_H_
#include "Side.h"

class Order {
public:
    int _id;
    Side _side;
    int _ackedPrc;
    int _ackedQty;
    int _requestedPrc;
    int _requestedQty;
    int _filledQty;

    Order();
    void cancel();
    void amend(int prc, int qty);
    void amended();
    void acked();
    void onFill(int fillQty);
    int filledQty();
    int prc();
    int remainingQty();
    int id();
    Side side();
    bool pendingMod();
};

#endif /* ORDER_H_ */

これにはまだインクルードガードが含まれているため、コンパイル単位に一度だけ含まれます。これで、cpp ファイル (定義を含む) は、おそらく次のようになります。

#include <Order.hpp>

Order::Order(){
    _id = -1;
    _side = BID;
    _ackedPrc = -1;
    _ackedQty = 0;
    _requestedPrc = 0;
    _requestedQty = 0;
    _filledQty = 0;
}
void Order::cancel(){
    _requestedQty = 0;
}
void Order::amend(int prc, int qty){
    _requestedPrc = prc;
    _requestedQty = qty;
}
void Order::amended(){
    _ackedPrc = _requestedPrc;
    _ackedQty = _requestedQty;
}
void Order::acked(){
    amended();
}
void Order::onFill(int fillQty){
    _filledQty += fillQty;
}
int Order::filledQty(){
    return _filledQty;
}
int Order::prc(){
    return _requestedQty;
}
int Order::remainingQty(){
    return _requestedQty - _filledQty;
}
int Order::id(){
    return _id;
}
Side Order::side(){
    return _side;
}
bool Order::pendingMod(){
    return _ackedPrc != _requestedPrc || _ackedQty != _requestedQty;
}

私は明らかにこれをまったくテストしていないことに注意してください。注意すべき主なことは、ここに Order クラス関数の本体があるということです。名前のスコープは Order クラス内に限定する必要があることに注意してください。お役に立てれば。

于 2012-11-07T01:07:22.780 に答える