C++에서 궁금한게 있습니다!!
class Robot { public: static Robot& createRobot(string name, int level): mName(name), mLevel(level) { } virtual upgradeLevel() = 0; private: Robot(); Robot(const Robot& rhs); Robot& operator=(const Robot& rhs); string mName; int mLevel; };
---------------------------------------------------------------
Robot이라는 매우 간단한 클래스입니다.
궁금한게 2가지가 있습니다.
Q1. Robot이라는 클래스에서는 "createRobot"이라는 static 함수를 써서만 객체를 생성할 수 있게하려고 합니다.
따라서, 기본 생성자는 물론 복사 생성자, 복사 대입 연산자까지 private으로 막아두었는데요.
Robot r1 = Robot.createRobot("kkbot", 1);
위와 같은 문장으로 생성을 하려니 "Error. Robot::Robot(const Robot& rhs)에 엑세스 할 수 없다."는 에러가 뜹니다.
저는 static 함수로 객체를 생성하려 했을 뿐인데 왜 위의 코드에서 복사 생성자가 불리게 되는지 이해가 되질 않습니다.
어떻게 하면 에러 없이 제가 의도한 대로 static 함수를 써서만 객체를 생성할 수 있을까요?
Q2. Robot 클래스의 데이터 멤버인 mName(로봇의 이름), mLevel(로봇의 레벨)을 주목해주시기 바랍니다.
저는 Robot 클래스를 추상 클래스로 제공해서 다른 클래스들이 상속받고 이 데이터 멤버들을 쓰게 하고 싶은데요.
private에 있는 데이터 멤버들은 상속받았다 하더라도 접근이 안되잖아요.
그렇다고 public에 데이터 멤버들을 두자니 영 찝찝하고...
어떻게 하면 좋을까요? 좋은 설계 방법이 있을까요?
제가 생각해본 1안) base 클래스의 데이터 멤버를 public에 놓고 상속은 private 상속으로 받는다.
제가 생각해본 2안) 좀 귀찮더라도 데이터 멤버는 상속되는 클래스들에 일일이 선언한다.
(예를 들면, class ARobot: public Robot { ... private: string mName; int mLevel; }; <- 이렇게)
gilgil.net
객체의 선언과 동시에 "="을 사용하면 assign operator가 호출되지 않고 copy constructor가 호출되게 됩니다.
해결 방법은
www.gilgil.net
해결방법은 뭔가요?ㅠ
우어 궁금...
gilgil.net
해결 방법은
1. call by value(pointer)로 한다.
2. call by reference로 한다.
단 2번에서는 createRobot라는 static function이 return하는 객체의 scope(언제 객체가 해제될 것인지)에 대한 주의를 해 주셔야 합니다.
ps : Distinguish default , explicit and copy constructor and assign operator ( http://www.gilgil.net/9399 )
www.gilgil.net
댓글 달기