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
[16036] Re:Re:Re:Re:Re: 파스칼 언어로는 불가능
빌더(TWx) [builder] 2122 읽음    2019-06-05 10:09
: 답변 정말 감사드립니다. 답변들이 정말 엄청나시네요. 받아먹기 힘든 제 지식이 안타깝네요.
:
: 혹시 이런건 가능한지 여쭤봐도 되나요?
:
: 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 1556 2019/05/27
16032     Re:메모리 해제되어있는지 여부판단방법 빌더(TWx) 1971 2019/05/29
16033         Re:Re:메모리 해제되어있는지 여부판단방법 100jk 2128 2019/05/30
16034             Re:Re:Re: 델파이 FMX 메모리 매니지먼트 구조는 실패작 입니다 빌더(TWx) 2220 2019/06/03
16035                 Re:Re:Re:Re: 델파이 FMX 메모리 매니지먼트 구조는 실패작 입니다 100jk 1747 2019/06/03
16036                     Re:Re:Re:Re:Re: 파스칼 언어로는 불가능 빌더(TWx) 2122 2019/06/05
16037                         Re:Re:Re:Re:Re:Re: 파스칼 언어로는 불가능 100jk 1616 2019/06/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.