: 답변 정말 감사드립니다. 답변들이 정말 엄청나시네요. 받아먹기 힘든 제 지식이 안타깝네요.
:
: 혹시 이런건 가능한지 여쭤봐도 되나요?
:
: 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++만 이용하고 있지요.