빌더(TWx) 님이 쓰신 글 :
: : 답변 정말 감사드립니다. 답변들이 정말 엄청나시네요. 받아먹기 힘든 제 지식이 안타깝네요.
: :
: : 혹시 이런건 가능한지 여쭤봐도 되나요?
: :
: : var
: : b1, b2: tbitmap;
: : begin
: : b1 := tbitmap.create;
: : b2 := b1;
: :
: : 여기서 b2가 자기가 생성자로 생성된 놈인지 아니면 다른곳에서 생성된 클래스를 참조만 하는놈인지 알 수 있는 방법이 있나요?
: :
: : (목표는 클래스를 알아서 정리해주는 모듈을 제작해보고 싶습니다)
: :
: :
:
:
: 답변:
:
:
: 질문에 언급되어 있는 내용은 std::shared_ptr 이용해서 C++로 코딩하면 간단하게 처리할 수 있지만
: 파스칼 언어로는 불가능 합니다.
:
:
: C++에선...
:
: class CSharedObj;
:
: ....
:
: class A
: {
: std::shared_ptr<CSharedObj> obj;
: };
:
: class B
: {
: std::shared_ptr<CSharedObj> obj;
: };
: ...
:
: std::shared_ptr<CSharedObj> created_obj(new CSharedObj);
:
: created_obj 를 클래스 A와 B의 멤버인 obj에 각각 assign 해주는 것 만으로
: 하나의 CSharedObj 클래스 인스턴스를 A와 B에서 공유해서 사용할 수 있고...
: 클래스 A와 B 가 소멸될 때 까지 인스턴스를 유지하고 있다가
: A와 B 둘다 소멸될 때... 공유되어 있던 CSharedObj 인스턴스가 exception 발생 여부와 상관없이
: 안전하게 해제 됍니다.
:
:
:
: std::shared_ptr 기능을 하는 클래스를 파스칼로 구현해 주면 델파이로도 가능하지 않을까
: 생각할 수도 있겠지만...
:
:
: class CSharedObj
: {
: public:
: CSharedObj() {
: printf("constructor ()\n");
: }
: ~CSharedObj() {
: printf("destructor ()\n");
: }
: std::string Name = "hello...";
: };
:
: int main()
: {
: std::shared_ptr<CSharedObj> t1(new CSharedObj), t2;
:
: t2 = t1;
: return 0;
: }
:
: ...
:
: t2 = t1; 에서...
:
: assignment 오퍼레이터인 = 오퍼레이터 오버로드가 파스칼 언어에선 지원되지 않기 때문에
: 델파이 파스칼 언어로는 불가능 하고...
:
:
: 다음과 같이 std::shared_ptr 을 상속해서 = 오퍼레이터를 오버로드해서 weak 상태를 알아내도록
: C++ 언어를 이용하면 간단하게 구현할 수 있지요.
:
:
:
:
: template < class T > class ManagedPointer : public std::shared_ptr< T >
: {
: public:
: using shared = std::shared_ptr< T >;
:
: explicit ManagedPointer() : shared() {}
: template < class U >
: explicit ManagedPointer(U u) : shared(u) {}
:
: auto& operator=(const ManagedPointer& _rhs) noexcept {
: if (!*this) bWeaked = true; // lhs
: shared::operator=(_rhs);
: return *this;
: }
: bool IsWeaked() { return bWeaked; }
: private:
: bool bWeaked = false;
: };
:
: class CSharedObj
: {
: public:
: CSharedObj() {
: printf("constructor ()\n");
: }
: ~CSharedObj() {
: printf("destructor ()\n");
: }
: std::string Name = "hello...";
: };
:
: int main()
: {
: ManagedPointer< CSharedObj > t1(new CSharedObj), t2;
:
: t2 = t1;
:
: std::cout << t2->Name << std::endl;
:
: if (t2.IsWeaked())
: printf("t2: object not created by constructor explicitly\n");
:
: return 0;
: }
:
:
: 파스칼 언어는 제약 사항이 많아요. (초보자들이 사용하기는 쉽지만 미성숙한 언어)
:
: 그래서 프로덕션 코드 개발할 때... 델파이는 안 쓰고 C++만 이용하고 있지요.
:
:
답변 정말 감사드립니다.
많은 공부가 됐네요.
감사합니다.