2010-05-11 9 views
0

또 다른 Scrabble 프로젝트 질문 ... 이것은 간단한 것입니다.Beginner C++ - 헤더 파일의 전역 상수를 사용하는 데 문제가 있습니다.

내가 문제 내 전역 상수가 인식 얻는 데 보인다

내 board.h : http://pastebin.com/7a5Uyvb8

오류가 반환

1>C:\Users\Francisco\Documents\FEUP\1A2S\PROG\projecto3\projecto3\Board.h(34): error:  variable "TOTAL_ROWS" is not a type name 
1>  vector< vector<Cell> > _matrix(TOTAL_ROWS , vector<Cell>(TOTAL_COLUMNS)); 
1> 
1>main.cpp 
1>compilation aborted for .\Game.cpp (code 2) 
1>Board.cpp 
1>.\Board.h(34): error: variable "TOTAL_ROWS" is not a type name 
1>  vector< vector<Cell> > _matrix(TOTAL_ROWS , vector<Cell>(TOTAL_COLUMNS)); 
1>         ^
1> 

왜 이런 일이 발생합니까? 왜 컴파일러는 타입을 기대합니까?

시간 내 주셔서 감사합니다.

편집 :

무시 내 이전 편집 ... 이것은 내 기본 생성자 : 보드 :: 보드() { _matrix (TOTAL_ROWS, 벡터 (TOTAL_COLUMNS)); }

다음과 같은 오류가 나타납니다.

1>.\Board.cpp(16): error: call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type 
1>  _matrix(TOTAL_ROWS, vector<Cell>(TOTAL_COLUMNS)); 
1>  ^

왜 이런 일이 발생합니까?


내 파일의 모든 문제를 해결할 수있었습니다. 내가 대신

Board::Board() : 
    _matrix(TOTAL_ROWS, vector<Cell>(TOTAL_COLUMNS)) 
    {} 

을 사용했습니다. 모든 도움을 주셔서 감사합니다!

+0

헤더 파일을 표시하십시오. –

+0

해당 헤더 파일은 내 게시물에 있습니다. pastebin 링크입니다. 다소 크고 거기에 업로드했습니다. –

+0

표시되는 오류는 온라인 상태입니다 (34). 그러나, 당신이 연결하는 board.h 파일은 오직 라인 (30)으로 간다. 오류가 어디에 있는지 정확하게 이해하는 데 도움이 필요합니다. 그러나 가장 좋은 추측은 잠시 후에 답변에 포함될 것입니다. – abelenky

답변

4

작성 방법, 당신은을 정의 벡터를 반환하는 _matrix라는 함수. 따라서 TOTAL_ROWS은 매개 변수 유형으로 구문 분석되므로 형식 이름이어야합니다. 당신이하려고하는 것은 _matrix라는 변수를 정의하는 것이라고 가정합니다. 벡터입니다.

당신이 원하는 것은 생성자를 떠나서 생성자 안에서 변수를 초기화하는 것입니다. 적어도 현재 버전의 표준에서는 상수 정수 값만 클래스 본문에서 초기화 할 수 있습니다.

중요하지 않은 부분을 떠나 :이 그냥 예입니다

Board() : _matrix(TOTAL_ROWS, vector<Cell>(TOTAL_COLUMNS)) { } 

private: 
    vector< vector<Cell> > _matrix; 

참고. 아마도 실제 몸체가 Board() 인 구현 파일을 가지고 있기 때문에 머리글에 직접 초기화하지 말고 초기화해야합니다. 그렇지 않으면 오류가 발생합니다. 중요한 것은 처음에 _matrix을 선언 할 때 사용하지 않아야한다는 것입니다. 새 질문에 대한


, extern const unsigned int TOTAL_COLUMNS = 15;TOTAL_COLUMNS Board.h이 파일에 포함되어있는 모든 시간을 정의합니다. 네임 스페이스 범위의 상수 변수는 기본적으로 내부 연결을 가지고 있으므로 extern을 끝내면 괜찮을 것입니다.

일반적으로 변수가 일정하지 않으면 _matrix과 비슷한 접근 방식을 사용합니다. 당신은 헤더의 초기화를두고 다음 된 구현 파일 내부에 다시 ​​넣어 :

board.h : 이 extern const int TOTAL_COLUMNS;

board.cpp가 : extern const int TOTAL_COLUMNS = 15;

0

헤더 파일 (또는 그 문제의 코드)에서 생성자를 호출 할 수 없습니다. 헤더 파일에서

+0

죄송합니다, 이해하지 못했습니다. –

+2

내가 말하고자하는 바를 이해하는 동안, 이제는 공식화 된 것과 같은 답이 여러 가지면에서 잘못되었습니다 ... – KillianDS

1

, 나는 참조 :

private: 
    vector< vector<Cell> > _matrix(TOTAL_ROWS , vector<Cell>(TOTAL_COLUMNS)); 

이 개인 멤버 변수, _matrix를 선언하는 것, 그리고 분명히 동시에 _matrix의 생성자를 호출하기위한 노력의 일환이다. 이런 식으로 생성자를 호출 할 수 없습니다.

헤더 파일은 많은 프로그램 파일에 포함될 수 있습니다. 결과적으로 헤더에는 실행 지침이 포함되어서는 안됩니다 (인라인 메서드 및 템플릿과 같은 일부 예외가 있음). 헤더가 포함될 곳을 알 수 없으므로 헤더 파일의 코드가 어디에 표시되는지 알 수 없습니다.

어디서나에 안전하게 포함되도록 헤더 파일을 작성하는 것이 좋습니다. 명시 적으로 멤버 변수 구성한다) 위원회 (의 생성자 :이 코드를 계속하려면

, 나는 제안 그리고

Board::Board() : 
    _matrix(TOTAL_ROWS, .....); 
    // This will call the matrix constructor ONLY when the Board constructor is called. 
{ 
} 

이사회 생성자가 호출되어야한다, 그러나 단지 .cpp 파일 , .h 파일에는 없습니다.

+1

사실 헤더에는 인라인 및 템플릿 방법의 정의가 포함되어야합니다. –

+0

그건 내가 의도 한 것이 아닙니다. 나는'_matrix'를 TOTAL_COLUMNS * TOTAL_ROWS 차원의 벡터 벡터로 만들려고했습니다. 이 작업을 수행하는 올바른 방법은 무엇입니까? –

+0

@ 마크 B : 인라인 스터디를 도입하여 초보자를 혼동하지 마십시오. 초보자는 헤더 파일에 처리 지침이 포함되어서는 안된다는 사실을 알아야합니다 (실제로 필요한 경우 제외). – abelenky

2

당신은 개체 변수에 대해이 작업을 수행하는 올바른 방법이 아니다 그것의 정의에 벡터를 초기화하는 시도는, 올바른 방법은 이것이다 :

extern const unsigned int TOTAL_ROWS = 15; 
extern const unsigned int TOTAL_COLUMNS = 15; 
class Board 
{ 
public: 
     Board() : _matrix(TOTAL_ROWS, vector<Cell>(TOTAL_COLUMNS)) {} 
private: 
     vector< vector<Cell> > _matrix; 
}; 
1

이 내 기본이다 생성자 :

보드 :: 보드 (_ {_matrix (TOTAL_ROWS, 벡터 (TOTAL_COLUMNS)); }

다음과 같은 오류가 발생합니다. [....]

@Dennis Zickefoose, @KillianDS 및 나 자신이 제공 한 예제 및 구문을 따르지 않았습니다.

답변을 다시 읽고 코드를 공부하십시오.

+0

정확합니다. 죄송합니다. –

관련 문제