Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[16037] Re:Re:Re:Re:Re:Re: 파스칼 언어로는 불가능
100jk [] 1600 읽음    2019-06-06 23:54
빌더(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++만 이용하고 있지요.
:
:

답변 정말 감사드립니다.

많은 공부가 됐네요.

감사합니다.

+ -

관련 글 리스트
16031 메모리 해제되어있는지 여부판단방법 100jk 1535 2019/05/27
16032     Re:메모리 해제되어있는지 여부판단방법 빌더(TWx) 1959 2019/05/29
16033         Re:Re:메모리 해제되어있는지 여부판단방법 100jk 2104 2019/05/30
16034             Re:Re:Re: 델파이 FMX 메모리 매니지먼트 구조는 실패작 입니다 빌더(TWx) 2207 2019/06/03
16035                 Re:Re:Re:Re: 델파이 FMX 메모리 매니지먼트 구조는 실패작 입니다 100jk 1735 2019/06/03
16036                     Re:Re:Re:Re:Re: 파스칼 언어로는 불가능 빌더(TWx) 2110 2019/06/05
16037                         Re:Re:Re:Re:Re:Re: 파스칼 언어로는 불가능 100jk 1600 2019/06/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.