1

多くの異なるクラスで使用したい関数がいくつかあります。私は1つの基本クラスから派生したいくつかのクラスを持っているので、基本クラスが関数を保持し、子クラスがそれらを呼び出すことができるようにしようとしました。これによりリンク エラーが発生するようだったので、この質問 ( C++ で静的メソッドのみを使用するクラスの利点)からのアドバイスに従って、名前空間にスイングを与えることにしましたが、すべてのヘッダー/ファイルに含まれる唯一のファイルは resource.h です。そして、自分の関数の名前空間をそこに入れたくありません。いじるのに特化しているようです。

私の質問は、名前空間または使用したい関数のみを含むクラスを作成して、このクラスを含めて関数を必要に応じて使用できるようにするにはどうすればよいですか?

助けてくれてありがとう、私がインターネットで見つけた答えは、私が対処したいと思っているような複数のファイルではなく、1つのファイルにのみ焦点を当てています:)

4

2 に答える 2

1

名前空間には何でも入れることができますが、ものの中に名前空間を入れることはできません (これはあまり正式な言い方ではありませんが、私の言いたいことが理解できることを願っています.

有効

namespace foospace
{
    class foo
    {
    public : 
        foo();

        ~foo();

        void eatFoo();

    };
}

無効

namespace foospace
{
    class foo
    {
    public : 
        foo();

        ~foo();

        namespace eatspace
        {  
            void eatFoo();
        }

    };
}

2 番目の例がコンパイルされないことを 100% 確信しているわけではありませんが、とにかく実行しないでください。

さて、あなたのコメントから、次のようなものが欲しいようです:

ファイル内Entity.hのエンティティ クラス定義:

namespace EntitySpace
{
    class Entity
    {
    public : 
        Entity();
        ~Entity();   
    };
}

ファイル内Player.h

#include "Entity.h"
namespace EntitySpace
{
    class Player : public Entity
    {
    public : 
        Player();
        ~Player();   
    };
}

ファイル main.cpp 内

#include "Player.h"

int main()
{
    EntitySpace::Player p1;
    EntitySpace::Player p2;

}

したがってPlayer、EntitySpace 名前空間で呼び出します。これがあなたが求めていたものに答えることを願っています。

于 2013-07-09T22:44:32.873 に答える
1

名前空間の使用方法について混乱しているようです。名前空間を使用する場合は、次の点に注意してください。

  • 構文を使用して名前空間を作成しますnamespace identifier { /* stuff */ }。間のすべてが{ }この名前空間に含まれます。
  • ユーザー定義型または関数内に名前空間を作成することはできません。
  • 名前空間は、開いたグループ構造です。これは、後で他のコードでこの名前空間にさらに多くのものを追加できることを意味します。
  • 名前空間は、他の言語構造とは異なり、宣言されません。
  • 名前空間スコープ内に特定のクラスや関数が必要な場合は、定義されている場所のヘッダーで名前空間構文を使用して囲みます。これらのクラスを使用するモジュールは、ヘッダーが取得されるときに名前空間を認識します#include

たとえば、次のようにしますEntity.h

// Entity.h
#pragma once

namespace EntityModule{
class Entity
{
public:
  Entity();
  ~Entity();
  // more Entity stuff
};

struct EntityFactory
{
  static Entity* Create(int entity_id);
};

}

内部では、次のmain.cppようにアクセスします。

#include "Entity.h"

int main()
{
  EntityModule::Entity *e = EntityModule::EntityFactory::Create(42);
}

Playerこの名前空間にも入りたい場合は、それも次のように囲みnamespace EntityModuleます。

// Player.h
#pragma once
#include "Entity.h"

namespace EntityModule{
class Player : public Entity
{
  // stuff stuff stuff
};
}

これは、上記のポイント 3 のために機能します。

何らかの理由でクラス内に名前空間を作成する必要があると感じた場合は、ネストされたクラスを使用してこれをある程度シミュレートできます。

class Entity
{
public:
  struct InnerEntity
  {
    static void inner_stuff();
    static int  more_inner_stuff;
    private:
      InnerEntity();
      InnerEntity(const InnerEntity &);
  };
  // stuff stuff stuff
};

ただし、この方法で行ういくつかの重要な違いと注意事項:

  • static特定のインスタンスが関連付けられていないことを示すために、すべてが で修飾されています。
  • テンプレート パラメーターとして渡すことができます。
  • ;末尾にa が必要です。
  • で便利な略記を作成することはできませんabusing namespace Entity::InnerEntity;。しかし、これは良いことなのかもしれません。
  • class名前空間とstructは異なり、閉じた構造です。つまり、一度定義されたメンバーを拡張することはできません。多重定義エラーとなります。
于 2013-07-09T22:41:27.297 に答える