2017-11-29 9 views
-5

안녕하세요, 저는이 문제에 논리적으로 문제가있어 도움이 필요합니다. 내가 설정 한 것은 'objects'라는 기본 클래스와 'robot'이라는 파생 클래스입니다. 나는 다른 클래스 '게임'에 '로봇'의 인스턴스를 만들었습니다. 여기에는 '로봇'(포인터를 통해)이 포함됩니다. 그래서 내가 가지고있는 코드 행은기본 클래스는 파생 클래스의 속성을 어떻게 알 수 있습니까

robot* rob = new robot(int x, int y) 

입니다. 여기서 position은 클래스 로봇의 속성입니다. 내 '객체'클래스에서 x 및 y 좌표는 비공개로 설정되므로 x 및 y 좌표에 대한 Get 및 Set 함수가 있습니다.

이제 '로봇'클래스가 자신의 x 및 y 좌표를 액세스하고 업데이트 할 수 있음을 이해합니다. 'objects'클래스에 x와 y를 포함시키고 변경할 수 있습니까? 이 작업을 수행 할 때 생각한 방식은 '객체'에 '게임'멤버를 만들고 '객체'에서 '로봇'의 위치를 ​​변경하는 것입니다. 그러나 '롭'이 '객체'에 대한 참조로 전달되므로 여전히 x 및 y 좌표를 변경할 수 있습니까? 그 이후에도 '게임'은 '롭'의 새로운 위치를 어떻게 알 수 있습니까?

+0

게시물을 편집하여'objects' 및'robot' 클래스의 내용을 포함하십시오. –

+2

'로봇'이 '객체'에서 파생되고 '객체'만이 'x'와 'y'를 갖는 경우 '로봇'은 'x'와 'y'인스턴스를 한 번만 갖습니다. 제목 질문에 대답하려면 - 그것은하지 않습니다 – Fureeish

+0

기지는 그것에서 파생 된 것들에 대해 아무것도 모릅니다. 비인과적인 행동에 대해 생각해보십시오. – user4581301

답변

1

기본 클래스는 더 많은 특수 클래스를 추상화 한 것입니다. 결과적으로 기지는 그것으로부터 파생 된 사람들에 대해 아무것도 모르고, 알 필요가 없다. 모든 클래스가 알고있는 것은 그 자체이며 클래스가 사용할 수있는 클래스가 무엇인지 알고 있습니다.

또한 C++ 빌드 프로세스로 향후 자식 클래스의 모든 가능한 순열을 알 수 없습니다. 아직 작성되지 않았거나 나중에 또는 런타임에 링크 될 수도 있고 연결되지 않을 수도있는 다른 모듈에있을 수도있는 코드를 알아야합니다.

대부분의 시간 동안 하위 클래스를 통해 기본 클래스의 멤버를 조작하려면 아무 것도 할 필요가 없습니다. publicprotected 변수의 경우 하위 클래스에서 기본 클래스의 내용에 액세스 할 수 있습니다. private 데이터는 평소와 같이 제한이 없습니다 (단, friend 발송 함). 기본 클래스는 대부분의 경우 일을 할 것 int x

x = 24; 

있다

합니다.

이것은 기본 이름과 서브 클래스 모두에 동일한 이름의 변수가있는 경우에만 문제가됩니다. 일부 코드에 대한

시간 :

#include <iostream> 
struct object // using struct because it defaults to public access. 
       // This makes for a simpler example 
{ 
    int x; 
    int y; 
}; 

struct robot:public object 
{ 
    int x; // variable hides the x in object 
    int y; 

    void print() 
    { 
     std::cout << "robot: " << x << ',' << object::x << '\n'; 
     // to access object's x we must ask for it explicitly 
    } 
}; 

struct betterrobot:public object 
{ 
    void print() 
    { 
     std::cout << "better robot: " << x << ',' << object::x << '\n'; 
    } 
}; 
int main() { 

    robot rob; 
    rob.x = 24; // set robot's x 
    rob.object::x = 42; // set object's x 
    rob.print(); 

    betterrobot rob2; 
    rob2.x = 24; 
    rob2.print(); 

    return 0; 
} 

출력 :

로봇 : 24,42

더 나은 로봇 : 24, 24

Objectrobot 가지고 자신의 자신의 xy. objectx 명시 xobject::x 다른 답을 주었다 인쇄 출력에 그것을

rob.object::x = 42; 

요청하여 robot 통해 도달 할 수있다.그것은 robot::print 방법을보고으로 만

rob.x = 24; 

스마트 컴파일러는 즉시 object::x를 초기화하지 않는 당신 비명됩니다. 그렇지 않다면, 행복한 디버깅!

이것은 두뇌에 혼란을 야기하기 때문에 드물게하고 싶은 것입니다. 당신은 두 개의 x을 가지고 있고 polymprphic 객체 (Note : 일을 간단하게하기 위해 예제에서 다형성 객체가 없다)로 작업 할 때 정말 망쳐 놓고 틀린 것을 설정한다. x. 그것을 피할 방법이 없다면 이것을하지 마십시오.

혼동을 피하기 위해 기본 클래스의 변수를 상속하고 사용하는 것이 거의 항상 좋습니다. 이것은 betterrobot입니다. betterrobotobjectxy 만 있습니다. 혼동 할 가능성은 없습니다.

rob2.x = 24; 

모두 있습니다. 산출물에서, xobject::x을 인쇄하면 같은 대답을 얻을 수 있습니다.

다른 object처럼 betterrobot을 이동할 수 있습니다. object, move의 기능은 예를 들어 betterrobot을지도에서 움직일 수 있습니다. 특별한 마법은 필요하지 않습니다.

+0

매우 유용합니다! 고맙습니다 – ZWang

관련 문제