0

次のレイアウトを持つ、自分のものではないコードベースに取り組んでいます。

object.h:

// Objects are defined
// #include "tickets.h" (functions to access the objects)
// An access-handler object is defined

オブジェクトを認識し、tickets.h の関数からアクセスできるクラスを導入したいと思いますが、アクセス ハンドラ オブジェクトも使用できます。関数は分離されています。つまり、tickets.h で呼び出されるクラス関数はアクセス ハンドラを使用しません (そうでなければ、どこから始めればよいかわかりません)。

したがって、私のクラスは ticket.h の前に定義する必要がありますが、その関数の一部は access-handler の後に定義する必要があります。次のような 2 つのヘッダー ファイルに分割せずにこれを行う方法はありますか。

// Objects are defined
//  -- include declaration of class, and definition of functions that tickets.h needs
// #include "tickets.h"
// An access-handler object is defined
//  -- include functions of class that need the access-handler

このようなものを 2 つの別々のファイルに分割するのは非常に面倒に思えます。

助けてくれてありがとう、私は明らかにC ++の宣言/定義について非常に初歩的な理解しか持っていません。

編集:前方宣言を使用して、(mynewclass.h で宣言されたクラスと mynewclass.cc で定義された関数を使用して) ticket.h の前に含めると、mynewclass.cc は mynewclass.h を含めた後に宣言されたオブジェクトを使用できますか? つまり、アクセス ハンドラ オブジェクトです。

EDIT2:このようなもの:

object.h:

class obj { // definition }

#include "tickets.h"

class obj_handler {
    public void handle { // code }
}

ticket.h:

void do_something(obj o){
    communicator.foo();
}

私のオブジェクト(コミュニケーター):

class communicator {
    public:
        void foo() { // code } 
        void bar() { // use handle() from obj_handler }
}

ご覧のとおり、私のコミュニケーターは ticket.h で使用する必要がありますが、obj_handler の後まで定義できません。では、どこに含める必要がありますか?

4

2 に答える 2

2

私があなたの質問を正しく理解していれば、前方宣言を使用してこの問題を解決できます。これにより、メソッドを定義する前にクラスを宣言できます。例えば:

// this is forward declaration of class A, no definition provided
class A;

class B
{
// uses A
A * a_;
};

// class A definition
class A
{
// may use class B now
B * b_;
};
于 2013-07-27T16:17:37.520 に答える
1

私がこれを正しく理解しているかどうかはよくわかりませんが、ここでこれをコメントするのに十分な評判がまだありません.

あなたが参照しているのは、クラス定義全体、つまり、クラス宣言内にすべての関数定義を含むものだと思います。それ以外では、オブジェクト定義の後にプリプロセッサ ディレクティブが続くことはあまり一般的ではありません。ただし、典型的なのは、関数の前方宣言とクラス プロトタイプです。

たとえば、 some で次のように宣言できますheader.h

class C 
{
public:
    void method1(void);
    int method2(void);
};

また、implementation.cpp次のような関数の定義もあります。

void C::method1(void) { /*...*/ }

アクセス ハンドラがインクルージョン チェーンの前にある他のファイルで、他の関数を定義します。

int C::method2(void) { /*...*/ }

ところで、アクセス ハンドラとはどういう意味ですか?

ああ、ヘッダー ファイルで関数定義を行うと、リンカが怒鳴る可能性があります。


補遺に関して:大まかに言えば、前方宣言を配置するすべての場所で、コンパイラは問題の宣言のコピーを挿入します。ファイルシステムのコンテキストでのソフトリンクと見なしてください。関数シグネチャまたはクラスの前方宣言が多数ある場合、所要時間の増加やコンパイルのメモリ負荷など、それに関連するマイナスの影響があります。問題の実際のコードを知っているのはあなただけなので、これがあなたの特定の状況に当てはまるかどうかを判断することは不可能です。しかし、ほとんどの場合、それはうまくいくでしょう。

次のページをご覧ください。

  1. http://en.wikipedia.org/wiki/Forward_declaration
  2. 前方宣言はいつ使用できますか?
于 2013-07-27T16:20:05.103 に答える