공통베이스에서 파생 된 객체 집합이 ApiObject
입니다. 별도의 데이터 구조로 모든 ApiObject를 등록 할 수 있어야하지만 기본 클래스가 아닌 객체의 실제 주소를 가져야합니다. 다중 상속을 사용하고 있습니다.생성자 초기화 후
파생 된 개체의 주소를 알 수 없기 때문에 코드를 ApiObject
생성자에 개체를 등록 할 수 없습니다. 파생 클래스의 생성자에 넣을 수도 없습니다. 실제로 다른 파생 클래스를 구성하는지 여부를 알 수 없으므로 (예 : B
클래스가 A
에서 상속되고 둘 다 구성 될 수 있음).
그래서 내가 볼 수있는 유일한 옵션은 명시 적으로 그러나
B* b = new B(...);
RegisterObject(b);
에서, 우리는 객체를 생성 할 때마다 등록 함수를 호출하는 것입니다 내가 가지고, 이것은 매우 좋은 해결책이 될 것 같지 않습니다 매번이 함수를 호출하는 것을 잊지 마십시오.
나는 왜 내가이 일을하는지 더 많은 내용을 설명해야한다고 생각합니다. 객체는 오버로드 된 new 연산자를 통해 생성되며 객체가 생성 된 컨텍스트 (Lua 상태)를 알 필요가 있습니다. 예 :
Foo* object = new(L) Foo(...);
// Foo is derived from ApiObject, and we want ApiObject to have a reference to L
현재는 다소 unelegant 방식으로 수행된다 - 새로운 오퍼레이터는 개체 유형을 설명하는 몇몇 추가 데이터와 함께 거기에 L 포인터를 객체 전에 추가 바이트를 할당 및 저장한다. 그런 다음 기본 클래스는 init 함수를 통해이 '메타 데이터'에 대한 포인터를받습니다.
그렇지 않으면 마음에 오는 첫 번째 사실은 가상 함수이지만 생성자에서 호출 할 수 없으므로 기본
ApiObject
포인터를 등록해야하지만 이후의 가상 함수 만 호출하면됩니다. 그게 내 현재 구현보다 더 예쁘지 않은지 모르겠다.
실제 주소로 무엇을 하시겠습니까? –
@JoachimPileborg "파생 된 개체와 기본 개체 모두에서 동일합니다."--- 아니요, 실제로는 아닙니다. –
@JoachimPileborg 이것은 기본 클래스와 파생 클래스에서 동일한 실제 주소가 아니며 _Not_가됩니다. –