2013-11-24 3 views
0

Извините за стену текста, но у меня есть куча кода, который я написал примерно в 9 файлах, и я не могу избавиться от одной ошибки между тем, что, по моему мнению, является файлом заголовка и файлом cpp ....Header to cpp file confusion

здесь заголовочный файл

#pragma once 


class Draw; 

class Shape { 
public: 
    enum Direction {LEFT = -1, RIGHT = 1}; 
    enum Name{I,J,L,O,S,Z,T}; 

    Shape(Name); 
    void draw(Draw &) const; 
    void move(int dx, int dy); 
    void rotate(Direction); 
    bool map(int x, int y) const; 
    int x() const { 

     return x_; 
    } 
    int y() const { 

     return y_; 
    } 

private: 
    Name name_; 
    int angle_; 
    int x_; 
    int y_; 
}; 

вот CPP файл, чтобы идти вместе с файлом заголовка

#include "shape.h" 
#include "draw.h" 

Shape::Name(Name name): name_(name), 
    angle_(0), 
    x_(3), 
    y_(0) 

    void Shape::draw(draw &p) const { 

     p.setColor(static_cast<draw::Color(name_)); 
     for(int y = 0; y < 4; y++) 
      for(int x = 0; x < 4; x++) 
       if(map(x,y)) 
        p.rect(x + x_) * 8 + 1, 
        p.rect(y + y_) * 8 + 1, 
        p.rect(x + x_ + 1) * 8 - 1, 
        p.rect(y + y_ + 1) * 8 - 1); 
} 

bool Shape::map(int x, int y) const { 

    static const char *SHAPES[] = 

    { 
     " 8 " // I 
     " 8 " 
     " 8 " 
     " 8 ", 

     " 8 " // J 
     " 8 " 
     " 88 " 
     " ", 

     " 8 " // L 
     " 8 " 
     " 88 " 
     " ", 

     " " // O 
     " 88 " 
     " 88 " 
     " ", 

     " 8 " // S 
     " 88 " 
     " 8 " 
     " ", 

     " 8 " // Z 
     " 88 " 
     " 8 " 
     " ", 

     " " // T 
     " 888" 
     " 8 " 
     " " 
    }; 

    static const struct { 
     int x; 
     int y; 
    } 
    ROTATE[][16] = { 
      { 
     { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 }, 
     { 1, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 }, 
     { 2, 0 }, { 2, 1 }, { 2, 2 }, { 2, 3 }, 
     { 3, 0 }, { 3, 1 }, { 3, 2 }, { 3, 3 } 
    }, 
    { 
     { 3, 0 }, { 2, 0 }, { 1, 0 }, { 0, 0 }, 
     { 3, 1 }, { 2, 1 }, { 1, 1 }, { 0, 1 }, 
     { 3, 2 }, { 2, 2 }, { 1, 2 }, { 0, 2 }, 
     { 3, 3 }, { 2, 3 }, { 1, 3 }, { 0, 3 } 
    }, 
    { 
     { 3, 3 }, { 3, 2 }, { 3, 1 }, { 3, 0 }, 
     { 2, 3 }, { 2, 2 }, { 2, 1 }, { 2, 0 }, 
     { 1, 3 }, { 1, 2 }, { 1, 1 }, { 1, 0 }, 
     { 0, 3 }, { 0, 2 }, { 0, 1 }, { 0, 0 } 
    }, 
    { 
     { 0, 3 }, { 1, 3 }, { 2, 3 }, { 3, 3 }, 
     { 0, 2 }, { 1, 2 }, { 2, 2 }, { 3, 2 }, 
     { 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1 }, 
     { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 } 
    } 
    }; 

    return SHAPES[name_] 
    [ROTATE[angle_][y * 4 + x].y * 4 + ROTATE[angle_][y * 4 + x].x != ' '; 
} 

void Shape::move(int dx, int dy) { 

    x_ += dx; 
    y_ += dy; 
} 

void Shape::rotate(Direction d) { 

    angle_ = (angle_ + d + 4) % 4; 
} 

здесь ошибка я получаю:

1>------ Build started: Project: Tetris, Configuration: Debug Win32 ------ 
1>Build started 11/23/2013 11:21:58 PM. 
1>InitializeBuildStatus: 
1> Touching "Debug\Tetris.unsuccessfulbuild". 
1>ClCompile: 
1> All outputs are up-to-date. 
1> shape.cpp 
1>\\hart-server\users\admin\documents\school\tetris\tetris\shape.cpp(4): error C2146: syntax error : missing ')' before identifier 'name' 
1>\\hart-server\users\admin\documents\school\tetris\tetris\shape.cpp(4): error C2146: syntax error : missing ';' before identifier 'name' 
1>\\hart-server\users\admin\documents\school\tetris\tetris\shape.cpp(4): error C2059: syntax error : ')' 
1>\\hart-server\users\admin\documents\school\tetris\tetris\shape.cpp(4): error C2470: 'name' : looks like a function definition, but there is no parameter list; skipping apparent body 
1>\\hart-server\users\admin\documents\school\tetris\tetris\shape.cpp(4): error C2065: 'name' : undeclared identifier 
1>\\hart-server\users\admin\documents\school\tetris\tetris\shape.cpp(9): error C2612: trailing 'type' illegal in base/member initializer list 
1>\\hart-server\users\admin\documents\school\tetris\tetris\shape.cpp(110): fatal error C1004: unexpected end-of-file found 
1> 
1>Build FAILED. 
1> 
1>Time Elapsed 00:00:02.17 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

ответ

1

Вы забыли брекеты для тела конструктора:

Shape::Shape(Name name): name_(name), 
    angle_(0), 
    x_(3), 
    y_(0) 
{} // <--- 

Вы также орфографическими ошибками его: Shape::Name. Он должен быть Shape::Shape.

+0

спасибо, что было главное, что я не мог видеть – hartk1213

1

У вас есть несколько проблем, которые я вижу. Во-первых, не используйте #pragma once, используйте

#ifndef HEADER_FILE 
#define HEADER_FILE 

class definition 

#endif 

Это один технически не является ошибкой, но это лучшая практика.

Во-вторых, вы не указали свое определение конструктора, как указал @Haroogan.

В-третьих,

void Shape::draw(draw &p) const { 

должен быть

void Shape::draw(Draw &p) const { 

четвёртых,

p.setColor(static_cast<draw::Color(name_)); 

должен быть

p.setColor(static_cast<Draw::Color>(name_)); 

это

if(map(x,y)) 
       p.rect(x + x_) * 8 + 1, 
       p.rect(y + y_) * 8 + 1, 
       p.rect(x + x_ + 1) * 8 - 1, 
       p.rect(y + y_ + 1) * 8 - 1); 

Это просто совершенно неправильно, и я понятия не имею, что вы пытаетесь сделать здесь.

+0

Да, какая-то хорошая книга на основах C++ для автора не повредит вообще. ':)' –

+0

im, делающий игру в тетрис, и которая рисует форму ... каждая фигура состоит из четырех квадратов, выполненных в разных формах (L, J, S, Z, O, I, T), которые должны помогите мне привлечь их .... есть ли лучший способ сделать это? если есть im все уши для справки im a no a noob im sorry – hartk1213

+0

@ user1822409 Я однажды пришел в такое замешательство, но так как вы просите гораздо лучший подход к реализации игры в тетрис, попробуйте [this] (http: // javilop. ком/Gamedev/тетрис-учебник-в-с-платформа независимых сфокусированный в игре-логике-для начинающих /). Это очень хороший учебник. – mr5