다소 혼란 스러울 수도 있습니다. 기본적으로, 함수 새로운 CCard 변수를 생성하고 호출자에게 돌려다시 변수 초기화
CCard newCard()
{
/* Used to store the string variables intermittantly */
std::stringstream ssPIN, ssBN;
int picker1, picker2;
int pin, bankNum;
/* Choose 5 random variables, store them in stream */
for(int loop = 0; loop < 5; ++loop)
{
picker1 = rand() % 8 + 1;
picker2 = rand() % 8 + 1;
ssPIN << picker1;
ssBN << picker2;
}
/* Convert them */
ssPIN >> pin;
ssBN >> bankNum;
CCard card(pin, bankNum);
return card;
}
이
선생님은이 일을하는 것은 OOP 원칙의 위반이고에가 나에게 조언CCard card = newCard();
수업에 참여하십시오. 그는이 방법을 생성자로 사용하라고했습니다. 내가 한 일 :
CCard::CCard()
{
m_Sperre = false;
m_Guthaben = rand() % 1000;
/* Work */
/* Convert them */
ssPIN >> m_Geheimzahl;
ssBN >> m_Nummer;
}
m_
의 모든 변수는 멤버 변수입니다. 나는이 프로그램의 시작 부분에 카드 일반적으로
CCard card();
를 초기화 할 때, 생성자 작동합니다. 그러나, 나는 또한 새로운 카드를 만들어서 그것을 사용자에게 돌려 주어야하는 함수를 가지고 있는데,이 함수는 이제 깨졌습니다.
원래 명령 : card = newCard();
은 더 이상 사용할 수 없으며 card = new CCard();
은 작동하지 않습니다. 다른 옵션은 무엇입니까? 생성자를 사용하는 느낌이 들지 않습니다. 클래스 메소드 newCard를 작성해야합니다.하지만 교사가 원했던 방식으로 어떻게 든 할 수 있는지 확인하고 싶습니다.
이것은 나를 위해 많은 두통을 만들어냅니다. 나는 선생님에게 이것이 어리석은 생각이고 모든 것이 OOP에서 분류되어야한다고 말했습니다. 그는 이후 Java 또는 C#이 클래스 외부의 코드를 허용하지 않는다고 말했고 약간 놀라운 것으로 들립니다. C++에서이 작업을 수행 할 수 있는지, 특히 템플릿 함수가 있거나 일반 알고리즘이있는 경우에는 특히 그렇습니다. 클래스에 강제로 넣지 않았다면 이것이 C++의 OOP에 나쁜 코드가된다는 것이 사실입니까?
편집 : 나는 그들의 도움이되는 답변을 모두에게 감사의 말씀을
! 그러나 나는 그 질문에 대한 나의 말씨가 조금 엉망이되어서 사람들이 내가 무엇을 찾고 있는지 이해하지 못한다고 생각한다.
할 일 아니요 CCard 유형의 다른 멤버를 초기화하려고합니다. 초기화하고 싶습니다
한 번 다음에 교사가 말한대로 생성자를 통해 card
개의 새 값을 제공하십시오. 새로운 CCard 객체를 만들고 싶지 않습니다. 동일한 변수를 새로운 값으로 다시 사용하십시오.
이것이 내가 생성자와 함께 작동하지 않는다고 말한 이유입니다. 그래서 초기화 된 변수 card
을 가져 와서 생성자를 다시 호출해야하는 함수가 있습니다 ("무엇?"가 교사에게 말한 것입니다). 그런 다음 새 값을 지정합니다.
예제 코드 :
void foo()
{
/* Initialize card with constructor */
CCard card;
/* Give it new values through the constructor AGAIN... */
card;
}
이 실제 질문입니다.나는 모두의 xD를 혼동하는 경우 미안 해요
"OOP로 모든 것을 분류 할 필요는 없지만 그는 Java 나 C#이 클래스 외부에서 코드를 허용하지 않는다고 나에게 이야기 해주었습니다. 너는 완전하고 선생은 바보 야. C++은 OOP 언어가 아니며 OOP만이 프로그래밍 패러다임이 아닙니다. 사실, 현대 C++ 디자인은 멤버 함수보다 자유 함수를 선호해야한다고 규정합니다! 선생님은 잘못된 것을 이유로 생성자로 이동해야 할 수도 있습니다. OOP가되기 위해 물건을 OOP로 만들지 말고, 그것이 의미가있는 경우 OOP로 만들고, 그렇지 않은 경우 OOP로 만듭니다. – GManNickG
그건 말하자면, 당신이하는 일에 달려 있습니다. 카드에 기본 상태가 있으면 기본 생성자가 그 것입니다. 그렇지 않으면 생성자에 속하지 않습니다. 그건 그렇고, 당신은'return CCard (pin, bankNum);'을 할 수 있고, 당신은 디폴트 생성자를 "호출"하지 않고 자동적으로 끝난다. (그 점은 디폴트 값으로 구성되어있다.) 새로운 카드'CCard someCard;를 만들고 그냥'someCard'를 디폴트로 만드십시오. – GManNickG
@GMan : 나는이 포괄적 인 성명서에 예외를 두었다 : "이것을하는 것은 OOP 원칙을 위반하는 것이다"; 그러나 "this"를 "생성자 외부에서 필요한 객체 상태 초기화 수행"을 의미하는 것으로 받아 들인다면 좋은 객체 설계를 위반하는 것에 동의 할 것입니다. –