를 만들려면 어떻게 해야 당신이 정체되는 클래스에서는 C++?
문제
를 만들려면 어떻게 해야 당신이 정체되는 클래스에서는 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;
}
이 코드를 사용할 수 있를 호출하는 방법과 동일한 방식으로의 예제 코드입니다.
도움이 됐으면 좋겠어!환호를 받았다.
다른 팁
고려 매트한 가격의 솔루션.
- C++에서는"개인정보취급방침"아무 의미가 없습니다.가장 가까운 것입니다 클래스 정적 방법과 회원입니다.
- 를 사용하여 정적 방법만 당신을 제한.
당신이 원하는 것은 표현에서는 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.
그것은 정말 중요한가요?
지 않는 한 사용자의 코드는 사보타(난로,당신이 운동을 찾을 수 있는 방법에 액세스할 수 있는 개인의 일부 공용 클래스를 사용하여 더러운 행동을 정의되지 않은 해킹...),무엇 private
가 private
, 는 경우에도,그것은에서 볼 수 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;
}
};