2016-09-29 4 views
0

この質問は何回か質問されていますが、通常のケースは循環インクルードのためですが、過去数時間にわたり、どこに循環的なものがあるのか​​を知ろうとしていました。私は何も宣言することができないと思う。私はおそらく間違っているので、いくつかの助けが必要ですエラー: '{'トークンの前に予期されるクラス名トークン - 循環が見つからないようです。

私が完了しようとしている割り当ては2つのADTをスタックともう1つのキューとして使用しています。これらのファイルはすべてのデータ型を受け入れるようにテンプレート化されていますが、このラボでは文字列を使用します。 Queue.h/.hppはQueueInterface.hとStackH/.hppを実装することになっています。

最後に、PreconditionViolationException.hという独自のエラーを定義する必要があります。サブクラスですのstd :: runtime_errorの。

Maybe this link will help if that's not a good explanation

おそらくいくつかの時間を節約するために、私は私が使用して、その後、私のMakefileだファイルのリストから始めましょう。

Executive.h/.cppの、main.cppに、Node.h/.HPP PreconditionViolationException.h/.cppのQueue.h/.HPP QueueInterface.h Stack.h/.HPP StackInterface.h

BuildingExecutive: main.o Executive.o PreconditionViolationException.o 
    g++ -std=c++11 -g -Wall main.o PreconditionViolationException.o Executive.o -o BuildingExecutive 

main.o: main.cpp 
    g++ -std=c++11 -g -Wall -c main.cpp 

PreconditionViolationException.o: PreconditionViolationException.cpp PreconditionViolationException.h 
    g++ -std=c++11 -g -Wall -c PreconditionViolationException.cpp 

Executive.o: Executive.cpp Executive.h Queue.hpp Queue.h Stack.hpp Stack.h Node.hpp Node.h StackInterface.h QueueInterface.h 
    g++ -std=c++11 -g -Wall -c Executive.cpp 

これは私のメイクファイルに関して、おそらくオフトピックの質問があります。私の質問は、自分のオブジェクトファイルとしてPreconditionViolationException.oをコンパイルしなければならない場合でしたか? StackedとQueueファイルはテンプレート化されているため明示的にコンパイルしない理由がわかりますが、PreconditionViolationExceptionに依存する唯一のファイルはテンプレート化されたファイルなので違いがありますか?私のエグゼクティブ(プログラムを出力して実行するファイル)は、PreconditionViolationExceptionに依存しません。std :: exceptionはキャッチする必要があります。これは、std :: runtime_errorがstd :: exceptionのサブクラスであるためです。

私のMakefileに目立つ問題がなければ、基本的にこれが循環インクルードを持っているかどうかを調べようとしました。

私はこのように見えるmain.cppで始まりました。

#include "Executive.h" 

int main(int argc, char** argv) { 
    Executive exec(argv[1]); 
    exec.Run(); 
    return 0; 
} 

これだけので、ここで

#ifndef EXECUTIVE_H 
#define EXECUTIVE_H 

#include "Queue.h" 
#include "Stack.h" 

class Executive { 
. 
. will cutout whatever isn't necessary 
. 
private: 
    Queue<std::string> Line; 
    Stack<std::string> Elevator; 
}; 
#endif 

このファイルはQueue.hとStack.hに依存していることであるので、ここで、Executive.hを含み、それらはその後

#ifndef QUEUE_H 
#define QUEUE_H 

#include "Node.h" 
#include "QueueInterface.h" 

template <typename T> 
class Queue : public QueueInterface { 
. 
. 
. 
}; 
#endif 

です
#ifndef STACK_H 
#define STACK_H 

#include "Node.h" 
#include "StackInterface.h" 

template <typename T> 
class Stack : public StackInterface { 
. 
. 
. 
}; 

私はNodeが原因であるとは思わないので、ここでここでの問題をINGのそれらのメソッドは、その例外を投げることができるので、インターフェース

#ifndef STACKINTERFACE_H 
#define STACKINTERFACE_H 

#include "PreconditionViolationException.h" 

template <typename T> 
class StackInterface { 
. 
. 
. 
}; 
#endif 

#ifndef QUEUEINTERFACE_H 
#define QUEUEINTERFACE_H 

#include "PreconditionViolationException.h" 

template <typename T> 
class QueueInterface { 
. 
. 
. 
} 
#endif 

これらのそれぞれは、PreconditionViolationExceptionが含まれています。私が間違っている場合

#ifndef PVE_H 
#define PVE_H 

#include <stdexcept> 
#include <string> 

class PreconditionViolationException : public std::runtime_error { 
. 
. 
. 
} 
#endif 

は私にしてください修正しますが、thisを読んだ後、私は私が何を宣言転送することができ、私のノードを宣言するときに、おそらく以外の場所があるとは思いません。どのようにまとめられているかについての私の理解は最高ではないので、私が考えることができる唯一の事は、私のmakefileがこの作業には適していなかったということです。

私は何が起こっているのかを追跡して理解しようと多くの時間を費やしています。そのため、何が起こっているのかをよく理解するのに役立つことを期待しています。

申し訳ありませんが、これは本当に長いです!どんな助けもありがとう!

答えて

2
template<class T> 
class Stack : public StackInterface { 

StackInterface(それはクラステンプレートです)クラスではありませんので、あなたがそれを継承することはできません。

おそらくStackInterface<T>から継承することを意味し、QueueInterfaceも同様です。

+0

Ah ........... duh。どうもありがとうございます。私はその笑いの後にちょっと馬鹿だと感じる。 –

関連する問題