문제

를 만들려면 어떻게 해야 당신이 정체되는 클래스에서는 C++?나는 할 수 있어야 다음과 같습니다.

cout << "bit 5 is " << BitParser::getBitAt(buffer, 5) << endl;

가정으로 만들었습 BitParser 클래스입니다.무엇을 할 것 BitParser 클래스 정의를 보입니까?

도움이 되었습니까?

해결책

당신의 방법을 적용하"고정"키워드를 등,다음과 같할 수 있습 C#에서 예를 들어,다음을 할 수 없을 사용하지 않고 Managed C++.

하지만의 스타일리시한 디자인 샘플을 만들 필요가 있습니다 public static 방법에 BitParser 개체입니다.그래서 다음과 같:

BitParser.h

class BitParser
{
 public:
  static bool getBitAt(int buffer, int bitIndex);

  // ...lots of great stuff

 private:
  // Disallow creating an instance of this object
  BitParser() {}
};

BitParser.cpp

bool BitParser::getBitAt(int buffer, int bitIndex)
{
  bool isBitSet = false;
  // .. determine if bit is set
  return isBitSet;
}

이 코드를 사용할 수 있를 호출하는 방법과 동일한 방식으로의 예제 코드입니다.

도움이 됐으면 좋겠어!환호를 받았다.

다른 팁

고려 매트한 가격의 솔루션.

  1. C++에서는"개인정보취급방침"아무 의미가 없습니다.가장 가까운 것입니다 클래스 정적 방법과 회원입니다.
  2. 를 사용하여 정적 방법만 당신을 제한.

당신이 원하는 것은 표현에서는 C++의미를 넣어 기능(그 기능)에서는 네임스페이스가 있습니다.

편집 2011-11-11

이 없다"고정"클래스에서는 C++.가장 가까운 개념이 될 것입 등으로 정적 방법입니다.예를 들어:

// header
class MyClass
{
   public :
      static void myMethod() ;
} ;

// source
void MyClass::myMethod()
{
   // etc.
}

하지만 당신은 기억해야한다는"정전 클래스는"해킹에 자바와 같은 종류의 언어(예:C#)을 수 있는 비-멤버 함수,그래서 대신 그들을 이동하는 내부에는 클래스 정적으로 방법입니다.

C++에서,당신이 정말로 원하는 것은 비-멤버 함수는 당신이 선언하는 네임스페이스:

// header
namespace MyNamespace
{
   void myMethod() ;
}

// source
namespace MyNamespace
{
   void myMethod()
   {
      // etc.
   }
}

그 이유는 무엇입니까?

에서는 C++,네임스페이스보다 더 강력한 클래스를 위한"Java 정적 방법"패턴이기 때문에:

  • 정적 방법에 액세스 클래스는 프라이빗호
  • 적인 방법은 여전히 볼 수 있(는 경우에 액세스할 수),모든 사람에게는 위반이 다소의 캡슐화
  • 정적인 방법이 될 수 없 전향을 선언
  • 정적 방법을 오버로드할 수 없습니다 클래스에 의해 사용자가 수정하지 않고 라이브러리 헤더
  • 거기에 아무것도 할 수 있는 정적 방법을 할 수 없는보다 더 나은(아마도 친구)비회원 기능에서 동일한 네임스페이스
  • 네임스페이스를 자신의 의미(결합할 수 있습니다,그들은 익명으로 할 수 있습니다,등등)
  • etc.

결론:하지 않는 복사/붙여넣기는 Java/C#'s 패턴 C++.Java/C#,패턴은 필수입니다.하지만에서는 C++,그것은 나쁜 스타일입니다.

편집 2010-06-10

이 있었는 인수에 찬성을 정적 방법이기 때문에 때때로,하나의 요구에 사용하는 정적인 구성원 변수입니다.

가 동의하지 않는 다소,아래 표와 같:

"정적인 회원"솔루션

// HPP

class Foo
{
   public :
      void barA() ;
   private :
      void barB() ;
      static std::string myGlobal ;
} ;

첫째,myGlobal 라고 myGlobal 기 때문에 그것은 여전히 글로벌 전용 변수입니다.보 CPP 소스가 명확히:

// CPP
std::string Foo::myGlobal ; // You MUST declare it in a CPP

void Foo::barA()
{
   // I can access Foo::myGlobal
}

void Foo::barB()
{
   // I can access Foo::myGlobal, too
}

void barC()
{
   // I CAN'T access Foo::myGlobal !!!
}

첫눈에,사실의 자유로운 기능 barC 액세스할 수 없습니다 Foo::myGlobal 것은 좋은 일에서는 캡슐화점...기 때문에 그것은 멋진 사람을 찾고 HPP 수 없(면 의지를 방해)에 액세스 Foo::myGlobal.

하지만 경우에 당신은 그것을 자세히 보면,당신은 당신을 찾을 수 있는것은 거대한 실수:뿐만 아니라 귀하의 개인 변수해야 합 선언에 HPP(그리고,눈에 보이는 세계에도 불구하고,개인),하지만 선언해야 합니다에 동 HPP 모든다(모든)기능하는 것에 액세스할 권한이 있다!!!

그래서 개인 정원과 같은 걷는 외부에서 누드 목록으로 당신의 애호가를위에 문신을 당신의 피부:아무 권한이 있는,그러나 모든 사람이 할 수 있네.보너스:모든 사람이 할 수있는 이름을 사람들의 승인을 재생하는 privies.

private 참으로...:-D

"Anonymous"네임스페이스 솔루션

익명의 네임스페이스가 있는 장점을 만드는 것이 개인이 정말로 프라이빗.

첫째,HPP 헤더

// HPP

namespace Foo
{
   void barA() ;
}

는지 확인하기 위해 당신에 급:거기에 아무 쓸모없는 선언의 바브나 myGlobal.는 것을 의미가 없다고 하는 헤더가 뒤에 숨겨진립니다.

그런 다음,CPP:

// CPP
namespace Foo
{
   namespace
   {
      std::string myGlobal ;

      void Foo::barB()
      {
         // I can access Foo::myGlobal
      }
   }

   void barA()
   {
      // I can access myGlobal, too
   }
}

void barC()
{
   // I STILL CAN'T access myGlobal !!!
}

당신이 볼 수있는,소위"개인정보취급방침 선언",fooA 및 fooB 은 여전히 접근할 수 있 myGlobal.하지만 다른 사람이 없습니다.고 다른 하나 밖에 이 CPP 알 fooB 및 myGlobal 도 존재!

과는 달리는"개인정보취급방침"걷에서 누드와 함께 그녀의 주소 예약에 문신 그녀 피부에"익명의"네임스페이스는 완전히 옷을 입고, 는 것 같다 꽤 나은 캡슐화된 AFAIK.

그것은 정말 중요한가요?

지 않는 한 사용자의 코드는 사보타(난로,당신이 운동을 찾을 수 있는 방법에 액세스할 수 있는 개인의 일부 공용 클래스를 사용하여 더러운 행동을 정의되지 않은 해킹...),무엇 privateprivate, 는 경우에도,그것은에서 볼 수 private 섹션의 클래스로 선언된 헤더가 있습니다.

여전히 추가해야 하는 경우 또 다른"개인"기능에 액세스하는 전용 회원이,당신은 여전히 신고해야합니다 모든 세계에 헤더를 수정하는 역설적으로했습니다: 변경하는 경우 구현 나의 코드(CPP 일부),다음의 인터페이스(HPP 일부)를 변경되지 않습니다. 을 인용하는데:"이것은 캡슐에 넣기!"

편집 2014-09-20

을 때는 클래스 정적 방법을 실제보다 더 나은 네임스페이스와 비회원 기능을 가지고 있는가?

필요할 때 함께 그룹화하는 기능을 먹이는 그룹을 템플릿:

namespace alpha
{
   void foo() ;
   void bar() ;
}

struct Beta
{
   static void foo() ;
   static void bar() ;
};

template <typename T>
struct Gamma
{
   void foobar()
   {
      T::foo() ;
      T::bar() ;
   }
};

Gamma<alpha> ga ; // compilation error
Gamma<Beta> gb ;  // ok
gb.foobar() ;     // ok !!!

기 때문에,경우에는 클래스가 될 수 있습니다 템플릿을 매개 변수는 네임스페이스 할 수 없습니다.

을 만들 수도 있습니다 자유로운 기능에는 네임스페이스:

에 BitParser.h

namespace BitParser
{
    bool getBitAt(int buffer, int bitIndex);
}

에 BitParser.cpp

namespace BitParser
{
    bool getBitAt(int buffer, int bitIndex)
    {
        //get the bit :)
    }
}

에서 일반적인 것이 선호하는 방법을 쓰는 코드입니다.할 때 필요가 없는 객체에 대한 사용하지 않습니다.

당신의 방법을 적용하"고정"키워드를 등처럼,당신은에서 할 수 있는 C#예제

정전 클래스는 단지 컴파일러 손으로 들고 당신과 당신을 중지에서 쓰기를 들어 어떤 방법/변수입니다.

는 경우에 당신은 단지 작성 정상급없이 모든 인스턴스 메서드/변수가 그 같은 일이며,이것은 당신이 무엇을 할 거라고는 C++

에서는 C++로 만들고 싶은 정적 기능의 클래스(정체되는 클래스).

class BitParser {
public:
  ...
  static ... getBitAt(...) {
  }
};

해야 합한 다음 호출 할 수 있도록 기능을 사용하여 BitParser::getBitAt()없이 인스턴스화는 개체군은 원하는 결과입니다.

할 수 있습니 같은 것을 작성 static class?

No, 에 따라, C++11N3337 표준 초안 Annex C7.1.1:

변경:C++에서 정체되거나 외부자만 적용될 수 있습 객체의 이름 또는 기능입니다.이러한 사용자 유형을 가진 선언에서 불법 C++.C 에서는 이러한 지정자는 무시할 때 사용 에서 유형을 선언할 수 있습니다.예제:

static struct S {    // valid C, invalid in C++
  int i;
};

설명:저장자가 없을 의미할 때와 관련된 유형입니다.에서는 C++클래스 회원이 선언할 수 있습으로 정적 스토리지 등 지정자.용 스토리지 등 지정자에 유형 선언을 렌더링 수 코드에 대한 혼란 사용자.

struct, class 또한 유형은 선언입니다.

같은이 될 수 있습니다 추론에 의해 걷는 구문에 나무는 부속서 A.

그것은 흥미로운 static struct 법적 C 지만,아무 효과가 없었: 왜 사용하는 경우 정적 구조에서는 C 프로그래밍이 가능한가요?

당신이 할 수 있는'정적 클래스에서는 C++,으로 언급하기 전에,정적인 클래스가 하나 있지 않은 모든 물체는 그것의 인스턴스화됩니다.C++에서 얻을 수 있습니다를 선언하여 생성자/소멸자로 개인이다.최종 결과 같습니다.

에 Managed C++,정체되는 클래스 구문은 다음과 같습니다.-

public ref class BitParser abstract sealed
{
    public:
        static bool GetBitAt(...)
        {
            ...
        }
}

...보다 더 늦게 없...

이것은 C#'s 한 방법을에서는 C++

C#파일입니다.cs 할 수 있는 개인 var 내부의 공공 기능이다.을 때 다른 파일에 사용할 수 있습니다 호출하여 네임스페이스 기능을 가진으로 in:

MyNamespace.Function(blah);

여기에는 방법은 imp 에서 동일한 C++:

SharedModule.h

class TheDataToBeHidden
{
  public:
    static int _var1;
    static int _var2;
};

namespace SharedData
{
  void SetError(const char *Message, const char *Title);
  void DisplayError(void);
}

SharedModule.cpp

//Init the data (Link error if not done)
int TheDataToBeHidden::_var1 = 0;
int TheDataToBeHidden::_var2 = 0;


//Implement the namespace
namespace SharedData
{
  void SetError(const char *Message, const char *Title)
  {
    //blah using TheDataToBeHidden::_var1, etc
  }

  void DisplayError(void)
  {
    //blah
  }
}

OtherFile.h

#include "SharedModule.h"

OtherFile.cpp

//Call the functions using the hidden variables
SharedData::SetError("Hello", "World");
SharedData::DisplayError();

과 달리 다른 관리 프로그래밍 언어,"개인정보취급방침"의미가 없는 C++.할 수 있는 정적 멤버 함수입니다.

그것이 주목되고 있 여기서 더 나은 방법으로 이러한 목적을 달성하기 위한 C++로 될 수 있을 사용하여 네임스페이스입니다.그러나지 않기 때문에 상 final 키워드,여기에 내가 무엇 게시 직접적인 동의 static class C#것처럼 보이는 C++에서 11 일 또는 그 이후:

class BitParser final
{
public:
  BitParser() = delete;

  static bool GetBitAt(int buffer, int pos);
};

bool BitParser::GetBitAt(int buffer, int pos)
{
  // your code
}

하나의 케이스는 네임스페이스 되지 않을 수 있습니다 그래서 달성하는 데 유용한"정 클래스"를 사용하는 경우 이러한 클래스를 달성하는 구성을 통해 상속입니다.네임스페이스할 수 없는 친구의 클래스고 그래서 액세스할 수 없는 개인의 멤버 클래스입니다.

class Class {
 public:
  void foo() { Static::bar(*this); }    

 private:
  int member{0};
  friend class Static;
};    

class Static {
 public:
  template <typename T>
  static void bar(T& t) {
    t.member = 1;
  }
};
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top