2

私は間違いなく絶望的な状況に陥っています... C++ を使用して、次の 2 つのクラスを定義しました。

// Console.hpp
#ifndef CLASS_Console
#define CLASS_Console
#include <iostream>
#include "Window.hpp"

class Console
{
public:
    Window *Win;
    Console(Windows *Win); // Which then does "this->Win = Win;"
    void AppendText(std::string);
    // And some more dozens functions
};
#endif

// Window.hpp
#ifndef CLASS_Window
#define CLASS_Window
#include <iostream>
#include "Size.hpp"

class Window
{
private:
    Console *m_Console;

public:
    Window(); // Which then does "m_Console = new Console(this); m_Console->AppendText("YEAH");"
    Console *getConsole(); // For use by another classes
    Size getSize();
    // And some more Tens and Tens of functions
};
#endif

最初は、「前方宣言を使用してください」と言うでしょう。

しかし、これらの数十の関数にアクセスする必要がある場合 (何らかの方法で、また別の方法で)、前方宣言の使用を避ける方法はありますか?

あなたの(将来の)答えをありがとう!

4

4 に答える 4

5

しかし、これらの数十の関数にアクセスする必要がある場合 (何らかの方法で、また別の方法で)、前方宣言の使用を避ける方法はありますか?

前方宣言が何をするのか理解できません。forで1 つの前方宣言を提供し、次にfromを含める必要があるだけです。window.hppConsoleconsole.hppwindow.cpp

于 2012-09-05T14:02:53.890 に答える
2

いいえ、(少なくとも) 前方宣言を回避する方法はありません。

しかし、これらの数十の関数にアクセスする必要がある場合

なぜこれが問題になるのでしょうか?パフォーマンス?もう何か測定しましたか?そうでなければ、パフォーマンスについて話すことはできません。

于 2012-09-05T14:01:41.253 に答える
1

通常の構造は次のとおりです。

  1. 最初のクラスを宣言します。class Console;
  2. 2 番目のクラスを定義します。class Window { Console *c; ...};
  3. 最初のクラスを定義します。 class Console { Window *w; ... };
  4. メンバー関数を定義するConsole::Console() { ... } ...

最初のクラス宣言は、(メンバー関数の定義なしで) 他のクラスの定義を記述するのに十分です。

次に、両方のクラスの定義の後、メンバー関数が宣言されるため、メンバー関数のコードは必要に応じて他のクラスのメンバーを使用できます。

于 2012-09-05T14:16:29.540 に答える
0

設計上、これらのクラスの 1 つだけに「外部」からアクセスする必要がある場合は、Console を Window 内にネストすることを検討できます (またはその逆)。

于 2012-09-05T14:07:15.440 に答える