1

私はハードウェアの専門家ですが、使用しているチップ設計ツールでは、C++コードを作成する必要があります。私はオブジェクト指向プログラミングに精通していません。私はCをうまく理解していますが、私が求めているのは、cq目前のタスクを実行するためにクラス(と呼ばれる)を構成する方法の説明です。

指定されたデータ型と指定されたサイズのキューを生成できるようにしたいと思います(生成後に変更されるべきではありません)。理想的には、これはこのように達成されます...

my_queue = new cq(uint8_t, 6);

...これは、6つの8ビット符号なし整数の配列(またはベクトル)を生成します。

次に、次のように、要素を最後に挿入し、キューの先頭にある要素を返すメソッドが必要です。

uint8_t front;
front = my_queue.advance(28);

これを実現するには、どのような構造が必要ですか?データ型は可変なので、テンプレートが必要ですか?または、ジェネリッククラスがあり、各データ型のクラスがその構造を継承する必要がありますか?

ありがとうございました!

編集:以下の回答からの入力を使用して、私は次のことを思いついた:

template <class type>
template <class size>
class CQ {

    private:
        // Allocates a queue with type and size
        // specified by template arguments.
        std::queue<type> cycle_queue(size, 0);

    public:
        // Inserts input to the end of the queue;
        // removes and returns the front element.
        type advance(type in){
            type out = cycle_queue.front();
            cycle_queue.push_back(in);
            cycle_queue.pop_front();
            return out;
        }

}

次に、私の質問は次のようになります...メインのC ++プログラムでこれをインスタンス化するにはどうすればよいですか?私はこれを試しましたが、うまくいきませんでした:

CQ<uint8_t><6> my_queue;
my_queue.advance(28);

再度、感謝します!

4

3 に答える 3

2

(ここ: http://www.cplusplus.com/reference/vector/vector/ ) または(ここ: http://www.cplusplus.com/reference/list/list/stl containers )のような の使用を検討してください。これらのコレクションは、達成したいことを既に行っています。クラスは、そのコレクションへのアクセサーを実装するだけで済みます。std::vectorstd::list

プロトタイプは次のようになります。

std::vector Variable<uint8_t>;

または、 を使用する必要がありますTemplates。それらが何であり、どのように機能するかについての包括的な説明は、ここにあります: http://www.cplusplus.com/doc/tutorial/templates/

本質的に、オブジェクトを次のように宣言します。

cq<uint8_t>(6);

コンストラクターでは、次のように記述します。

template <class T>
cq::cq(int amount) {
    Buffer = new T[amount];
}

「free」で使い終わったら、メモリの割り当てを解除することを忘れないでください。

于 2013-02-02T22:44:49.590 に答える
1

これは、 STL コンテナーの完璧なアプリケーションのように見えます。 独自のキュー クラスを (データ型を指定できるようにしたいため、テンプレート クラスとして) 記述できますが、車輪を再発明する必要はありません。

おそらく探しているのは: std::list、FIFO キューの場合です。あなたの特定の例では:

std::list<uint8_t> my_queue;
my_queue.push_back(28);            // push an element
uint8_t front = my_queue.front();  // get the element on the front of the queue
my_queue.pop_front();              // and then pop it

OOP と C++ にまだある程度慣れていない場合、独自のテンプレート クラスを作成することは、現時点では少し難しいかもしれません。試してみたい場合は、ネット全体に良い参考文献があります: http://www.cplusplus.com/doc/tutorial/templates/

于 2013-02-02T22:43:17.397 に答える
1

試す:

#include <cstdio>
#include <queue>

int main(int argc, char * argv[])
{
    std::deque<int> myQueue;

    myQueue.push_back(1);
    myQueue.push_back(2);
    myQueue.push_back(3);

    for (int i = 0; i < 3; i++)
    {
        int j = myQueue.front();
        printf("%d ", j);
        myQueue.pop_front();
    }

    getchar();
}


編集:コメントに応じて

私の頭に浮かぶ最も簡単な解決策は次のとおりです。

myQueue.push_back(newValue);
while (myQueue.size > 6)
    myQueue.pop_front();

実際、次のように、このコードを独自のクラスに簡単にラップできます。

template <class T>
class SixItemsQueue
{
private:
    std::deque<T> data;

public:
    void Push(T value)
    {
        data.push_back(value);
        while (data.size() > 6)
            data.pop_front();
    }

    T Pop()
    {
        T result = data.front();
        data.pop_front();
        return result;
    }
};
于 2013-02-02T22:43:32.633 に答える