1

Linuxでg++を使用してプログラミングしていますが、ヘッダーの後のポイントまたは別のヘッダーファイルで、後で定義するヘッダーファイルでクラスまたはデータ型を使用する必要があるという問題が頻繁に発生します。

たとえば、次のヘッダーファイルを見てください。

class example
{
    mydatatype blabla;
};

struct mydatatype
{
   int blablainteger;
   char blablachar;
};

mydatatypeは定義される前に使用されるため、これによりエラーが発生します。通常、次のように変更します。

struct mydatatype; // <-- class prototype
class example
{
    mydatatype *blabla; // <-- now a pointer to the data type
    // I will allocate the data during runtime with the new operator
};

struct mydatatype
{
   int blablainteger;
   char blablachar;
};

今では動作します。多くの場合、上記の定義を配置するか、必要なヘッダーを含めることができますが、ヘッダーにヘッダーを含めたり、定義の順序を調整したりしたくない場合は、常に面倒になります。

私が示した解決策は通常は機能しますが、今では新しい現象に遭遇しました。今回のデータ型はクラスではなくtypedefであり、typedefのプロトタイプを使用することはできず、typedefに組み込まれている実際のデータ型を使用したくありません。
これに対する解決策はありますか?

4

3 に答える 3

0

各クラス/タイプを独自のヘッダーファイルに配置し、関連するヘッダーファイルを必要な他のヘッダーにインクルードします。各ヘッダーで包含ガードを使用します。例:

// SomeHeaderFile.h
#ifndef SOME_HEADER_FILE_H
#define SOME_HEADER_FILE_H
// code
#endif

これが面倒であることに同意しません。プロジェクトに組織化された構造を持たせることができ、各クラスを他のクラスから独立して、順序を気にせずに動作させることができます。とにかく、各クラスを独自のファイルに配置することをお勧めします。

于 2013-01-12T16:35:21.553 に答える
0

まず、あなたが考えたソリューション(プロトタイプとポインター)は不要であり、ポインターなしで実装するよりも遅くなります。

このための「適切な」解決策は、タイプごとに個別のヘッダーを作成し、それらを他のヘッダーに含めることです。そうすれば、それは常に定義されます!あなたはそれらがお互いを含むようにそれらを作ることさえできます。

ただし、g ++によって提供されるファイルを開いたことがあれば.h、ヘッダーの先頭にこれが表示されている可能性があります。

#ifndef SOMETHING_H
#define SOMETHING_H

// Code

#endif /* SOMETHING_H */

これは、型が自分自身を再定義する問題を解決するためです。

それらが存在せず、ヘッダーファイルを複数回インクルードした場合、型が再定義され、エラーがスローされます。これにより、タイプは常に存在しますが、2回含まれることはありません。

お役に立てば幸いです。

于 2013-01-12T16:39:09.280 に答える
0

次のように他のクラス内にクラスを定義することができます

template<class T>
class vertex {
private:
    class edge {
    public:
        vertex<T> *to;
        double weight;
        edge() {
            weight = INFINITY;
            to = NULL;
        };
    } *paths;
    T data;
    unsigned nof_paths;
public:

    vertex(T val) {
        data = val;
        paths = NULL;
        nof_paths = 0;
    }
    void addPathTo(vertex<T>*&);

    edge* getAllPaths() {
        return paths;
    };
};

明らかに、これは小さなクラスで機能します...クラスが非常に大きい場合は、他の人が言ったように、別々のヘッダーファイルを使用する方が良いでしょう。

于 2013-12-06T02:54:50.010 に答える