2016-02-01 3 views
0

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

Проблема, которую я имел до сих пор, заключается в том, что функции, которые я сделал в прототипе в заголовке, а затем в исходном файле не распознаются source.cpp.

Это все написано в Visual Studio 2015 C++ имена

Файловые: monty.h и monty.cpp в порядке.

Нам даны два образца source.cpp файлов, чтобы проверить нашу работу, однако ни одна из них не дает мне никаких результатов из-за этой ошибки.

Предоставленная основная функция содержит #include "monty.h", однако проблема сохраняется.

Заголовок:

#ifndef MONTY_H 
#define MONTY_H 

class Monty{ 
private: 
    int wins; // Number of Wins 
    int ran; // Random Number Variable 
    int val; // Value to determine win/loss via functions 
    int x; // Determines number of times to repeat a function 
    int count; // Counts number of times function repeated 

    static int k(int); // 'Keep' choice function 
    static int s(int); // 'Switch' choice function 
    static int r(int); // 'Random' choice function 

public: 
    bool monty(char); 
    int monty(char, int); 
}; 
#endif 

Источник файла:

#include "monty.h" // Including header file & other necessary libraries 
#include <iostream> 
#include <cstdlib> 
using namespace std; 

bool Monty::monty(char y){ 
    x = 1; // Setting count variable to 1 in order to prevent functions from repeating. 
    if (y == 'k') // Calling functions depending on char input 
     val = k(x); 
    if (y == 's') 
     val = s(x); 
    if (y == 'r') 
     val = r(x); 

    if (val == 1) // Determining win/loss and returning value. 
     return true; 
    else 
     return false; 
} 

int Monty::monty(char y, int z){ 
    x = z; // Initializing independent count variable 
    wins = 0; // Initializing dependent wins variable 
    count = 0; 
    while (count < x) { 
     if(monty(y)) 
      wins++; 
    } 
    return wins; // Returning number of wins 
} 

int Monty::k(int x) { 
    int ran; 
    ran = rand() % 3; // Obtaining a random number from 0 to 2 
     if (ran == 1) { 
      return 1; 
     } 
     else 
      return 0; 
} 

int Monty::s(int x){ 
    int ran; 
    ran = rand() % 3; // Obtaining a random number from 0 to 2 
     if (ran == 1 || ran == 2) { 
      return 1; 
     } 
     else 
      return 0; 
} 

int Monty::r(int x) { 
    int ran; 
    ran = rand() % 2; // Obtaining random number from 0 to 1 
     if (ran == 0) 
      return k(x); 
     else 
      return s(x); 
} 

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

редактирует:

Точный код ошибки:

C3861 : 'monty': identifier not found - File: source.cpp - Line 18

Запрошенный образец основной файл

// monty_test1.cpp - Test program #1 for Monty module 

#include "monty.h" 

#include <climits> 
#include <cstdlib> 
#include <ctime> 
#include <iostream> 
using namespace std; 

static char get_strategy(); 

int main() { 

    // Initialize random number generator 
    srand(time(0)); 

    cout << "Testing monty function..." << endl << endl; 

    // Call monty function with user's choice of strategy, and report result 
    if (monty(get_strategy())) 
     cout << "Contestant won." << endl; 
    else 
     cout << "Contestant lost." << endl; 

#ifdef _WIN32 
    system("pause"); 
#endif 

    return 0; 
} 

// Prompt for and input strategy, with validation 
static char get_strategy() { 

    // Get strategy, must be 's', 'k', or 'r'. 
    char strategy; 
    cout << "Enter strategy (s, k, r): "; 
    cin >> strategy; 

    // Validate input 
    while (strategy != 's' && strategy != 'k' && strategy != 'r') { 
     cout << "Stragegy is not valid. Try again." << endl; 
     cin.ignore(INT_MAX, '\n'); 
     cin >> strategy; 
    } 

    // Discard any remaining input 
    cin.ignore(INT_MAX, '\n'); 

    return strategy; 
} 

Решение найдено удалял класс со ссылкой на monty функций в качестве основного функция не может быть отредактирована.

Requested Information about File Organization

+0

Пожалуйста, разместите сообщение об ошибке, которое вы видите. –

+0

Какое сообщение об ошибке? Сообщение об ошибке, вероятно, говорит, что происходит неправильно. –

+0

", а затем определяется в файле ресурсов": что это значит ??? Предположительно "и включен в исходный файл" ... –

ответ

0

Короткий ответ, предложенный dxiv:

При условии, что мы не можем изменить последние два файла на всех, мы можем объявить глобальную функцию monty(char) и иметь его создать временный объект класса Monty, а затем вызвать его monty(char) функцию следующим образом:

Добавить в monty.h:

bool monty(char c); 

Добавить в monty.cpp:

bool monty(char c) 
{ 
    return Monty.monty(c); 
} 

Но это в любом случае будет cludge, а не так, как классы предназначены для использования.

Длинный ответ:

// Call monty function with user's choice of strategy, and report result 
if (monty(get_strategy())) { /*...*/ } 

Что именно monty? Вы, очевидно, имеете в виду позвонить Monty::monty(char), но вы забудете сначала создать объект класса Monty!

Если идти, как это:

int main() { 
     // Initialize random number generator 
    srand(time(0));  
    cout << "Testing monty function..." << endl << endl; 

    Monty myMonty; 
    ^^^^^^^^^^^^^^ 
    // Call monty function with user's choice of strategy, and report result 
    if (myMonty.monty(get_strategy())) 
     cout << "Contestant won." << endl; 
    else 
     cout << "Contestant lost." << endl; 

#ifdef _WIN32 
    system("pause"); 
#endif 
     return 0; 
} 

Чтобы быть более точным:

Как было отмечено выше, вы намерены вызвать нестатический функцию-член класса Monty. Следовательно, вам нужно сначала создать объект такого класса, а затем вызвать функцию на этом объекте. Ошибка компилятора, которую вы видите, возникает, поскольку вы не объявили переменную monty в любом месте до ее использования, поэтому cannot find identifier (идентификатор == имя переменной в этом контексте).

Редактировать на замечание OP в:

В C++, действительно, на самом деле нет никакого способа, чтобы вызвать функцию, будь то статический или нет, не говоря уже о класс имя класса или имя класса объектов в , Таким образом, выражение monty(get_strategy()) подразумевает, что monty является либо именем глобальной или локальной функции, что не является тем, что вы разработали, очевидно; или это имя объекта с перегруженным operator(...), и в этом случае мы называем его объектом-функтором. В случае с кодом, который вы опубликовали, также не происходит, поэтому, чтобы заставить его работать с кодом неизменяемого профессора, вы хотите немного его переделать и сделать monty(char) глобальной функцией, а не публичной функцией-членом.

+0

Ой, мой плохой! Большое спасибо. – iksemyonov

+0

Файл 'source.cpp' не имеет моего дизайна. Любые изменения, которые я там делаю, будут, к сожалению, бесполезны, поскольку мой профессор, скорее всего, будет использовать предоставленный код выше, чтобы протестировать файлы, которые я создал, и это будут первые два. Я ищу решение, которое не включает изменение файла 'source.cpp'. Спасибо, что пытались помочь. –

+0

Извините, но как работает C++, это единственный способ вызвать нестационарную функцию класса! – iksemyonov

Смежные вопросы