2013-12-20 3 views
0

클래스와 분리 된 기능을 사용하여 행맨 게임을 만들어야합니다. 더 쉽게 할 수있는 방법은 각 왼쪽 라이브에 대해 기능을 만드는 것이었지만 전화 할 때 인쇄하지 않습니다 ... 아마 어느 누구와도이 문제를 해결할 수 있습니다. 감사합니다.교수형 교수형 게임 클래스를 사용하면 작동하지 않을 수 있습니다

This is the main 

// TheHangmanGame.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include "DrawHangman.h" 
#include <iostream> 
#include <string> 
#include <ctime> 


using namespace std; 

int main() 
{ 

    cout << "WHY wont u WORK!!!! \n" ; 
    cout << "asdf" << &DrawHangman::setDrawMan0 << "\n" ; 
    cout << "work \n"; 
    system("PAUSE"); 
    return 0; 
} 

// ----------------------------------------- ---

//header file 

#ifndef DRAWHANGMAN_H 
#define DRAWHANGMAN_H 
#include "stdafx.h" 
#include <string> 
using namespace std; 

class DrawHangman 
{ 
public: 
    DrawHangman(char); 


void setDrawMan0(char); 
int getDrawMan0(); 
void setDrawMan1(char); 
int getDrawMan1(); 
void setDrawMan2(char); 
int getDrawMan2(); 
void setDrawMan3(char); 
int getDrawMan3(); 
void setDrawMan4(char); 
int getDrawMan4(); 
void setDrawMan5(char); 
int getDrawMan5(); 
void setDrawMan6(char); 
int getDrawMan6(); 
}; 
#endif 

// -------------------------------

//cpp file 
#include "stdafx.h" 
#include "DrawHangman.h" 
#include <iostream> 

using namespace std; 

DrawHangman::DrawHangman(char) 
{ 
} 

void DrawHangman::setDrawMan0(char) 
{ 
    using namespace std; 
    cout << "_______" << endl; 
    cout << "|  |" << endl; 
    cout << "|" << endl; 
    cout << "|" << endl; 
    cout << "|" << endl; 
    cout << "|" << endl; 
} 
int DrawHangman::getDrawMan0() 
{ 
    return 1; 
} 
void DrawHangman::setDrawMan1(char) 
{ 
    cout << "_______" << endl; 
    cout << "|  |" << endl; 
    cout << "|  o" << endl; 
    cout << "|" << endl; 
    cout << "|" << endl; 
    cout << "|" << endl; 
} 
void DrawHangman::setDrawMan2(char) 
{ 
    cout << "_______" << endl; 
    cout << "|  |" << endl; 
    cout << "|  o" << endl; 
    cout << "| /" << endl; 
    cout << "|" << endl; 
    cout << "|" << endl; 
} 
void DrawHangman::setDrawMan3(char) 
{ 
    cout << "_______" << endl; 
    cout << "|  |" << endl; 
    cout << "|  o" << endl; 
    cout << "| /|" << endl; 
    cout << "|" << endl; 
    cout << "|" << endl; 
} 
void DrawHangman::setDrawMan4(char) 
{ 
    cout << "_______" << endl; 
    cout << "|  |" << endl; 
    cout << "|  o" << endl; 
    cout << "| /|\\" << endl; 
    cout << "|" << endl; 
    cout << "|" << endl; 
} 
void DrawHangman::setDrawMan5(char) 
{ 
    cout << "_______" << endl; 
    cout << "|  |" << endl; 
    cout << "|  o" << endl; 
    cout << "| /|\\" << endl; 
    cout << "| /" << endl; 
    cout << "|" << endl; 
} 
void DrawHangman::setDrawMan6(char) 
{ 
    cout << "_______" << endl; 
    cout << "|  |" << endl; 
    cout << "|  o" << endl; 
    cout << "| /|\\" << endl; 
    cout << "| /\\" << endl; 
    cout << "|" << endl; 
} 
+1

''Cout << "asdf"<< & DrawHangman :: setDrawMan0 << "이라고 생각하지 않습니다. \ n"; "당신이 생각하는대로합니다. – Borgleader

+0

k 내가 바꿨지 만 리턴 1을 넣었으므로 1을 반환합니다. 어떻게 쓰여지는지 프린트 할 수 있나요? –

+0

OOP 기본 사항을 검토해야합니다. a) 실제로 함수를 호출하지 않는다. (힌트 :'()'가 없으며 처음에는'&'를 사용하지 말아야한다.) b)'DrawHangman ::'도 틀렸다. 왜 그런지 알아 내야합니다. – Borgleader

답변

-1

cout 과부하를 시도하는 대신 표준 "c"함수로 "setDrawMan"을 호출하는 것이 더 좋지 않아야합니까? 대신

.h 
void setDrawMan0(char); 

main 
cout << "asdf" << &DrawHangman::setDrawMan0 << "\n" ; 

유형

.h 
void setDrawMan0(void); 

main 
cout << "asdf" << DrawHangman::setDrawMan0() << "\n" ; 

이 방법의

, 코드를 해석하고 행동의 예측 간단하다.

+0

"&"제거 할 때이 오류가 발생합니다 'DrawHangman :: setDrawMan0': 함수 호출 누락 된 인수 목록; 'DrawHangman :: setDrawMan0'을 사용하여 멤버에 대한 포인터를 만듭니다. –

+2

-1 : 질문이 C++에 관한 것이고 코드 샘플이 C 또는 C++로 유효하지 않으며 사용자가 ' 여기에서 다시 만들려고 노력합니다. OP의 사용되지 않는'char' 매개 변수가'void'로 변경되고 구문 오류가 수정되었습니다. 그래서 cout에 과부하가 걸리고 "코드를 해석하고 동작을 예측하는 것이 더 간단합니까?"라는 말은 무엇을 의미합니까? – JBentley

2

& DrawHangman :: setDrawMan0은 함수를 호출하지 않고 멤버에 대한 포인터를 반환합니다. 문제는 setDrawManX() 함수가 정적이 아니라는 것입니다.

정적으로 만들거나 인스턴스 메서드를 호출 할 DrawHangman의 인스턴스를 만들 수 있습니다.

또한 왜 각 기능에 두 가지 오버로드가 있습니까? 명명되지 않은 char 매개 변수에 대한 이유를 볼 수 없습니다.

+0

OP 코드에 과부하가 표시되지 않습니다. 그러나'get'로 시작하는 사용되지 않는 (그리고 대부분 정의되지 않은) 함수가 많이 있습니다. – JBentley

+0

당신 말이 맞아요. 나는 get ...()과 set ...() 메소드를 같은 이름을 가진 것으로 잘못 읽었다. –

2

코드에 많은 문제가 있습니다. 처음에는 함수의 주요 목적 중 하나가 코드 재사용과 avoid repeating yourself이지만, 각각의 set 함수는 이전 코드의 작업을 복제합니다.

제외하고, 여기에 당신이 당신의 코드가 작동 (하고 깔끔이 최대 약간)을 얻을 필요가 수정됩니다 :

  • #include <ctime> 제거하십시오 - 당신은이 헤더를 사용하지 않는가.

  • #include <string> 제거 -이 헤더를 사용하고 있지 않습니다.

  • using namespace std이 맨 위에있는 에있는 파일 중 .cpp의 파일에는 기능을 반복하지 마십시오.

  • 헤더 파일 내부에 using namespace std을 사용하는 것은 나쁜 관행입니다. 이는 헤더를 포함하는 파일의 모든 둘러싸는 네임 스페이스를 오염시키기 때문입니다. 어쨌든 헤더 파일에 std 네임 스페이스의 멤버를 사용하지 않으므로 무의미합니다.

  • 함수 호출 전에 &을 제거하십시오 - 해당 연산자는 원하는 기능이 아닌 주소를 반환합니다.

  • 함수를 올바르게 호출하십시오.매개 변수가없는 함수의 경우 함수 이름 뒤에 빈 괄호를 삽입하는 것을 의미합니다. setDrawMan0() 및 매개 변수가 있고 기본값이없는 함수의 경우 인수를 제공하십시오. setDrawMan0(1).

  • 사용하지 않는 기능에 매개 변수를 제공하지 마십시오. setDrawMan 함수에 char 매개 변수를 사용하고 있지 않습니다. 대신 함수를 setDrawMan() (매개 변수 없음)으로 정의하십시오.

  • getDrawMan 기능은 사용하지 않는 것으로 보이며 사용자는 대부분 정의하지 않았습니다. 삭제하거나 목적을 부여하십시오.

  • void을 반환하는 함수가 있다면 cout으로 스트리밍 할 필요가 없습니다. setDrawMan 함수 자체가 cout으로 스트리밍되므로 함수를 단독으로 호출하십시오. setDrawMan0() (그러나 다음 요점 참조).

  • setDrawMan 함수는 멤버 변수에 액세스하지 않으므로 static으로 선언하십시오. 실제로 여기서는 의미있는 방식으로 클래스를 사용하지 않고 있습니다. 관련된 모든 기능을 함께 수집하는 것뿐입니다. 이것은 네임 스페이스 내부에서 선언 된 자유 함수로서 그것들을 갖춤으로써 얻을 수도 있습니다.

  • 클래스를 실제로 사용하려는 경우 (그리고 할당이 필요하다고 생각되는 경우) 잘못된 방향으로 가고 있습니다. 서로 다른 하드 코딩 된 그리기 함수를 사용하는 대신 멤버 변수에 얼마나 많은 생명이 남았는지 추적하는 클래스를 작성하십시오. 그런 다음 생명의 수를 확인하고 적절히 그려주는 단일 그리기 기능을 갖추십시오.

+0

마지막으로 모든 것을 다루는 대답입니다. +1하지 않은 인내심. – Borgleader