头文件无法识别

时间:2016-02-01 23:55:49

标签: c++ visual-c++

我一直在为课堂上的问题工作超过6个小时,并遇到了一个令人困惑的障碍。不知道我犯了什么错误,我已经尝试移动东西,删除包含,添加包含,甚至删除以下类。

到目前为止我遇到的问题是我在标题中制作原型然后在源文件中定义的函数无法被正在使用的source.cpp识别。

这都是用Visual Studio 2015 C ++编写的

文件名依次为:monty.hmonty.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

1 个答案:

答案 0 :(得分:0)

dxiv建议的简短回答:

如果我们根本无法更改最后两个文件,我们可以声明一个全局函数monty(char)并让它创建一个类Monty的临时对象,然后调用它{ {1}}这样的功能:

添加到monty.h:

monty(char)

添加到monty.cpp:

bool monty(char c);

但无论如何,这无论如何都是一个混乱,而不是如何使用类。

答案很长:

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

究竟是什么// 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(标识符= =此上下文中变量的名称)。

根据OP的评论进行编辑:

在C ++中,确实没有办法打电话给一个班级&#39;功能,无论是否静态,不提及课程&#39;名称或类对象的名称。因此,表达式cannot find identifier意味着monty(get_strategy())或者是全局或局部函数的名称,这显然不是您设计的;或者它是具有重载monty的对象的名称,在这种情况下,我们将其称为仿函数对象。你发布的代码也不是这样的,所以为了让它与不可变教授的代码一起工作,你想重新设计它并使operator(...)成为一个全局函数,而不是公共成员职能。