a클래스, b클래스, c클래스 세개의 클래스 액터가 있고
저 클래스들은 같은 인터페이스를 상속받고 같은 함수를 재정의 했다고 했을때
다른 액터에 액터배열을 만들고, 저 a,b,c클래스를 모두 담은다음에
foreach돌려서 저 액터들의 인터페이스 함수를 호출하고 싶은데
이런거 인터페이스로 하는거 맞나요?
보통 액터배열에서 뽑아서 함수 호출할때 cast한다음에 뽑았는데
인터페이스로 cast는 안되는거 같더라구요
a클래스, b클래스, c클래스 세개의 클래스 액터가 있고
저 클래스들은 같은 인터페이스를 상속받고 같은 함수를 재정의 했다고 했을때
다른 액터에 액터배열을 만들고, 저 a,b,c클래스를 모두 담은다음에
foreach돌려서 저 액터들의 인터페이스 함수를 호출하고 싶은데
이런거 인터페이스로 하는거 맞나요?
보통 액터배열에서 뽑아서 함수 호출할때 cast한다음에 뽑았는데
인터페이스로 cast는 안되는거 같더라구요
dd
불러올때 어떤식으로 캐스트해서 인터페이스 함수에 접근해야 하나요?
형변환을 할 필요가 없음 그냥 객체에 메시지 호출하고 그 객체가 해당 메시지의 인터페이스를 구독하고 있으면 자동으로 연결된 이벤트 실행하는거임
언리얼은 클래스 구조가 일반 C++에서 해주는 구조 위에다가 자기네 인터페이스를 막 얹어서 구성해 둔거라 다중상속 같은거 막 하는거 좀 기분이 찜찜함.. 나라면 인터페이스용 공 액터 클래스를 하나 만들고 그 클래스를 상속받게할듯.. 네 말대로 결국 인터페이스인데 액터를 상속받는 인터페이스인거지 그리고 코드를 어떻게 짠건지 몰라서 잘 모르겠는데 다중 상속을 구성해두고 정작 컨테이너를 네 말대로 그 정보를 알 수 없는 반대편 클래스 (네 경우엔 AActor)로 모아두면 당연하지만 그걸로는 니 인터페이스 클래스로 캐스팅이 될 수 없음. 다형성 정보를 알 수 있는 클래스에서 캐스트를 해야 제대로 메모리 오프셋 처리가 되면서 캐스팅이 되는데
class A : public AActor, public IYourInterface 라고 쳤을때 TArray arr; 이런식으로 보관하면 거기서 인스턴스를 뽑아다가 IYourInterface로 캐스팅 할수는 없다는 얘기야. AActor* entry = arr[0]; IYourInterface* iEntry = (IYourInterface*)entry; // 안됨
저런 다중 상속 구조에서 캐스팅을 제대로 하려면 위에 적은대로 클래스 구성이 명확한 위치에서 다시 캐스팅 해야하는데 만약 arr에서 뽑은 entry가 A class 라는 걸 안다면 IYourInterface* iEntry = (IYourInterface*)(A*)entry; // 가능 이런식으로 명시적으로 A*로 먼저 캐스팅 해주는 것으로 가능은 함.. 근데 AActor로 모아둔 놈들중에 뽑은게 A인지 B인지 C인지를 어떻게 알아내느냐..는 뭐 rtti로 알아낸다손 치더라도 너무 번거롭긴 하지.. 그래서 내가 가장 첨에 제안한 방식을 쓸거라는 얘기임.. 아니면 애초에 컨테이너를 인터페이스 포인터로 하던가
꺽쇄괄호가 씹혀버리네 중간에 TArray[AActor*] arr; 에서 대괄호 꺽쇄로 바뀐거