2015-04-18 2 views
1

Я пишу программу со строками в VS13. И я хочу разделить объявления функций от определений функций. Я видел следующий принцип «область видимости» много раз в книгах:Определения функций вне структуры C++

<structure name>::<method name> 

Но когда я пытаюсь осуществить это в моей программе, я всегда получаю ошибку невозможности переопределения функций за пределами своего класса:

#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <string> 
#include <vector> 
#include <array> 
#define com 
using namespace std; 

int main() { 
    struct game { 
     int row, col, size, count = 1; 
     vector <vector<char>> b; 
     enum board { blank, zero, cross }; 
     char num[3]; 
     board first, second; 
     void numcreate(); 
     void create(); 
     void print(); 
     int check(); 
     void makemove(); 
     void process(); 
     void play(); 
    }; 

    void game::numcreate() { 
     num[0] = '_'; 
     num[1] = 'o'; 
     num[2] = 'x'; 
    } 
    void game::create() { 
     b.resize(size); 
     for (int i = 0; i < size; ++i) 
     { 
      b[i].resize(size); 
      b[i].insert(b[i].begin(), size, num[blank]); 
      copy(b[i].begin(), b[i].end(), ostream_iterator<char>(cout, " ")); 
      cout << endl; 
     } 
    } 
    void game::print() { 
     for (int i = 0; i < size; ++i) 
     { 
      copy(b[i].begin(), b[i].end(), ostream_iterator<char>(cout, " ")); 
      cout << endl; 
     } 
    } 
    int game::check() { 
     if (
      all_of(b[0].begin(), b[0].end(), [this](char t) {return (t == num[zero]); }) || 
      all_of(b[1].begin(), b[1].end(), [this](char t) {return (t == num[zero]); }) || 
      all_of(b[1].begin(), b[1].end(), [this](char t) {return (t == num[zero]); }) || 
      b[0][0] == num[zero] && b[1][1] == num[zero] && b[2][2] == num[zero] || 
      b[0][2] == num[zero] && b[1][1] == num[zero] && b[2][0] == num[zero] || 
      b[0][0] == num[zero] && b[1][0] == num[zero] && b[2][0] == num[zero] || 
      b[0][1] == num[zero] && b[1][1] == num[zero] && b[2][1] == num[zero] || 
      b[0][2] == num[zero] && b[1][2] == num[zero] && b[2][2] == num[zero]){ 
      return 1; 
     } 
     if (all_of(b[0].begin(), b[0].end(), [this](char t) {return (t == num[cross]); }) || 
      all_of(b[1].begin(), b[1].end(), [this](char t) {return (t == num[cross]); }) || 
      all_of(b[1].begin(), b[1].end(), [this](char t) {return (t == num[cross]); }) || 
      b[0][0] == num[cross] && b[1][1] == num[cross] && b[2][2] == num[cross] || 
      b[0][2] == num[cross] && b[1][1] == num[cross] && b[2][0] == num[cross] || 
      b[0][0] == num[cross] && b[1][0] == num[cross] && b[2][0] == num[cross] || 
      b[0][1] == num[cross] && b[1][1] == num[cross] && b[2][1] == num[cross] || 
      b[0][2] == num[cross] && b[1][2] == num[cross] && b[2][2] == num[cross]) { 
      return 2; 
     } 
    } 
    void game::makemove() { 

     if (count % 2 == 0){ 
      cout << "Please, enter the position on the board" << endl; 
      cin >> row; 
      cin >> col; 
      b[row][col] = num[zero]; 
     } 
     else { 
      cout << "Please, enter the position on the board" << endl; 
      cin >> row; 
      cin >> col; 
      b[row][col] = num[cross]; 
     } 
    } 
    void game::process() { 
     while (1) { 
      if (check() == 1) { cout << "First player has won" << endl; break; } 
      if (check() == 2) { cout << "Second player has won" << endl; break; } 
      makemove(); 
      print(); 
      system("cls"); 
      print(); 
      ++count; 
     } 
    } 

    void game::play() { 
     numcreate(); 
     create(); 
     process(); 
    } 

    game one; 
    one.size = 3; 
    one.play(); 
    cin.ignore(); 
    cin.get(); 
} 

Не могли бы вы сказать, где я ошибаюсь? В моей электронной книге я вижу аналогичный синтаксис

+1

Можете ли вы предоставить [MCVE] (http://www.stackoverflow.com/help/mcve)? Код, который вы скопировали, выглядит отлично. – Barry

+0

Все ли этот код в файле заголовка? Если это так, то определения функций становятся включенными для каждого файла cpp, который включает этот заголовочный файл. Разделите определения в отдельный файл cpp и сохраните декларации в файле заголовка – Kvothe

+0

@Barry Ok, отредактированный с полным кодом – VVG

ответ

2

Ваша проблема, что вы определяете свои функции вmain():

int main() { 
    struct game { 
     ... 
    }; 

    void game::create() { .. } 
} 

Просто переместите все это вне из main():

struct game { .. }; 
void game::numcreate() { .. } 

int main() { 
    // now use game 
}