错误:未在此范围内声明“对象”

     2023-02-22     52

关键词:

【中文标题】错误:未在此范围内声明“对象”【英文标题】:error: 'object' was not declared in this scope 【发布时间】:2017-01-08 14:33:01 【问题描述】:

我是 C++ 的新手,正在尝试制作 Monopoly 游戏。不幸的是,它仍然显示两个类之间的声明错误。 我已经尝试了所有方法,真的不知道问题出在哪里。

错误:“播放器”未在此范围内声明。

引擎.h

#ifndef ENGINE_H
#define ENGINE_H
#include "Player.h"
#include <vector>
using namespace std;
class Engine
public:
    Engine(); // method that starts with game, take random number for getting number of players, set players to vector
    void play(); // method where players are playing.
    bool returnBalance(int a_money) const; // method that return True, if the players has still some amount on account, False otherwise
    bool isWinner();
    int setBalance(); // method that set curretn player amount
    void printWinner(); // method that print winter of the game
    void payBills(int amount); // player pay any bills with this method
    virtual ~Engine();
private:
    vector<Player*> players;
    int i_player;
    int balance;
    int currentPlayer;
;
#endif /* ENGINE_H */

Engine.cpp

#include "Engine.h"
#include <iostream>
#include <stdlib.h>
using namespace std;

Engine::Engine() 
    int numPlayers = rand()*(6-2)+2;
    for (int i = 0; i <= numPlayers; i++)
        Player* p = new Player;
        players.push_back(p);
    
     cout << players.size() << endl; 

    int p_index = 0; 
     for(int i = 1; i <= players.size(); i++)
         p_index = i;
         p_index++;
         cout << p_index ;
     
    currentPlayer = p_index;     

    cout << "Welcome to MonOOpoly game, the game will be played in the same order you already are." << endl;


void Engine::play() 
    do

    while(!isWinner());


bool Engine::isWinner()
    int count = 0;
    for(int i = 1; i <= players.size(); i++)
        if(players[i]->getAmount() > 0)
            count++; 
    
    if(count <= 1)
        return true;
    return false;



int Engine::setBalance()
    int amount = players[currentPlayer]->amount;
    return players[currentPlayer]->amount;


bool Engine::returnBalance(int a_money) const
    if (players[currentPlayer]->amount < a_money)
        return false;
    else 
        return true;


void Engine::payBills(int amount) 
    players[currentPlayer]->amount = players[currentPlayer]->amount - amount;


void Engine::printWinner() 
    int winner = 0;
    int newWinner = 0;
    for(int i = 1; i <= players.size(); i++)
        if(players[i] > 0)
            winner = players[i]->getAmount();
            if(newWinner < winner)
                newWinner = winner;
        
    
    cout << "Winner of the game MonOOpoly is: " << newWinner << endl;


Engine::~Engine() 

播放器.h

#ifndef PLAYER_H
#define PLAYER_H
#include "Engine.h"
#include <string>
using namespace std;

class Player 
    friend class Engine;
public:
    Player(); // constructor
    int getAmount() const; // return how much of amount the player has yet
    void setAmount(int a); // set amount
    int getPosition() const; // return position of the player
    void setPosition(int p); // to set position
    virtual ~Player(); // destructor
private:
    int position; // the position of the player
    int amount; // the total amount
;


#endif /* PLAYER_H */

播放器.cpp

#include <iostream>
#include <stdlib.h>
#include "Player.h"
using namespace std;

Player::Player() 
    amount = 5000;
    position = 0;


int Player::getAmount() const 
    return amount;


void Player::setAmount(int a) 
    amount = a;


int Player::getPosition() const 
    return position;


void Player::setPosition(int p) 
    position = p;


Player::~Player() 

【问题讨论】:

Resolve header include circular dependencies的可能重复 尝试使用编译指示一次或类似的东西。由于 Engine.h 包含 Player.h,而 Player.h 包含 Engine.h,因此这里可能会发生一些冲突。 @eranotzap:他有非常好的包含守卫,不依赖于实现相关的行为。问题是当他包含 player.h 时,它包含 engine.h,它试图包含 player.h - 但实际上什么也没做。在那个指针处,engine.h 尝试使用类播放器 - 但它没有被声明。 Unrelated :您应该将players 向量设为std::unique_ptr&lt;Player&gt; 的向量。这样,当向量被销毁时,所有对象都会被删除。目前,您正在泄露所有内容。 @MartinBonner 首先没有注意到保护守卫。我是 C++ 新手,没有遇到您描述的问题。我们可以再看一遍吗? player.h -> engine.h -> 尝试 player.h 但由于保护措施不包括在内,并且不知道任何 Player 类。那么她如何在 Engine 中使用 Player 呢? 【参考方案1】:

您的标头中有循环包含,可能会导致您看到的编译器问题。 Engine.h 包含 Player.h,Player.h 包含 Engine.h

你应该:

#include Player.h 从 Engine.h 移动到 Engine.cpp 在 Engine.h(带有class Player;)行中前向声明 Player 类。

前向声明在这里很有用,因为Engine.h 只需要知道某个 Player 类的存在而不是它的完整定义,因为它只是定义了指向该类的简单指针向量。

【讨论】:

您能否展示一下您将如何做到这一点。我没有得到第二点。她怎么会感染引擎中的使用玩家? 第二点是建议在 Engine.h 中用class Player.h 替换行#include "Player.h" @eranotzap:如果您说“class Player;”,则表示声明该类,但没有定义它。一旦你声明了一个类,你就可以使用指向该类的指针和引用——但你不能拥有该类的实际对象。类 Engine 只包含指针,所以没问题。 (很明显,Engine 的成员函数将需要完整的 Player 定义,这就是您将其包含在 .cpp 中的原因)

错误“***未在此范围内声明”

】错误“***未在此范围内声明”【英文标题】:Error"***wasnotdeclaredinthisscope"【发布时间】:2020-09-2204:36:45【问题描述】:在这篇文章中,我定义了一个名为soft的函数。当我使用sourceCpp编译时,报错是ZH未在此范围内声明alp... 查看详情

数据“未在此范围内声明的成员”

...其添加对象),但是当我编译此程序进行测试时,返回此错误:...错误:“_bookingVector”未在此范围内声明|我 查看详情

“gets() 未在此范围内声明”错误 [重复]

】“gets()未在此范围内声明”错误[重复]【英文标题】:"gets()wasnotdeclaredinthisscope"error[duplicate]【发布时间】:2016-02-0705:47:25【问题描述】:使用以下代码,我得到“gets()未在此范围内声明”错误:#include<iostream>#include... 查看详情

未在此范围内声明 CvSVM 错误

】未在此范围内声明CvSVM错误【英文标题】:CvSVMwasnotdeclaredinthisscopeError【发布时间】:2015-10-2817:15:59【问题描述】:我正在使用OpenCV3.0.0我已经包含了所有这些库和命名空间,但我仍然收到“CvSVM未在此范围内声明”的错误#includ... 查看详情

Arduino:错误:“abs”未在此范围内声明

】Arduino:错误:“abs”未在此范围内声明【英文标题】:Arduino:error:\'abs\'wasnotdeclaredinthisscope【发布时间】:2013-04-1206:58:45【问题描述】:我正在开发一个需要abs()函数的arduino库:#include<math.h>normTransFreq1=abs(1.0);错误:\'abs\'... 查看详情

错误:`itoa` 未在此范围内声明

】错误:`itoa`未在此范围内声明【英文标题】:error:`itoa`wasnotdeclaredinthisscope【发布时间】:2011-06-2403:15:14【问题描述】:我有一个名为itoa.cpp的示例c文件,如下所示:#include<stdio.h>#include<stdlib.h>intmain()inti;charbuffer[33];prin... 查看详情

qrand 未在此范围内声明

...间】:2021-11-0810:14:48【问题描述】:我在玩游戏时遇到了错误-“Snake”。伪随机数字生成器不工作。它说“使用未声明的标识符qrand”或“未在此范围内声明qrand”也许我使用了错误的QT版本-5.0.2#include<QEvent>#include<QGraphicsSc... 查看详情

C++ 错误:“QueryFullProcessImageNameA”未在此范围内声明

】C++错误:“QueryFullProcessImageNameA”未在此范围内声明【英文标题】:C++error:\'QueryFullProcessImageNameA\'wasnotdeclaredinthisscope【发布时间】:2021-07-0808:05:44【问题描述】:我有这个功能,并且我有#include\'d必要的文件,但我仍然收到这... 查看详情

错误:未在此范围内声明“numeric_limits”

】错误:未在此范围内声明“numeric_limits”【英文标题】:Error:"numeric_limits"wasnotdeclaredinthisscope【发布时间】:2013-11-2701:22:17【问题描述】:我有一个无法为我编译的程序,但我不明白为什么,我收到错误“numeric_limits”... 查看详情

Arduino Average 库错误 - 未在此范围内声明

】ArduinoAverage库错误-未在此范围内声明【英文标题】:ArduinoAveragelibraryerror-wasnotdeclaredinthisscope【发布时间】:2014-06-2918:57:10【问题描述】:尝试在Mega2560上运行Averagelibraryexample尝试验证时出现以下错误:#include<Average.h>#defineC... 查看详情

Qt QOpenGLFunctions 未在此范围内声明

...正在为网格数据创建一种可绘制对象类,但出现此链接器错误。这也是处理在Qt教程之一中使用的网格绘制的另一个类的顶部。我还使用QGLWidget作为我正在绘制的表面。这是头文件查找第一个类的内容。#ifndefGLOBJECT_H 查看详情

代码块编译错误。 Cin 未在此范围内声明

】代码块编译错误。Cin未在此范围内声明【英文标题】:CodeBlockscompilationerror.Cinwasnotdeclaredinthisscope【发布时间】:2019-04-2311:46:03【问题描述】:当我想编译代码时,给我一个错误...cout和cin没有在这个范围内声明。有什么问题?... 查看详情

错误:to_string 未在此范围内声明

】错误:to_string未在此范围内声明【英文标题】:error:to_stringwasnotdeclaredinthisscope【发布时间】:2017-11-0111:23:13【问题描述】:我在solaris5.11上编译代码。G++版本是4.8.2。相同的代码可以在Ubuntu上运行,但会出现错误:在solaris上,... 查看详情

错误:____未在此范围内声明

】错误:____未在此范围内声明【英文标题】:error:____wasnotdeclaredinthisscope【发布时间】:2011-06-2902:51:12【问题描述】:当我尝试编译我的publishJoints代码时,我不断收到错误提示超出范围。这里是publishJoints.cpp代码#include<string>... 查看详情

如何修复“错误:‘_1’未在此范围内声明”?

】如何修复“错误:‘_1’未在此范围内声明”?【英文标题】:Howtofix"error:‘_1’wasnotdeclaredinthisscope"?【发布时间】:2020-07-0506:25:39【问题描述】:我目前正在尝试将函数绑定到我打算使用的算法。#include<iostream>#inc... 查看详情

错误:“getRotationMatrix2D”未在此范围内声明

】错误:“getRotationMatrix2D”未在此范围内声明【英文标题】:error:\'getRotationMatrix2D\'wasnotdeclaredinthisscope【发布时间】:2016-04-0109:45:05【问题描述】:我是NDK和OpenCv的新手。正在尝试编译一些本机C++代码。编译时出现错误error:\'get... 查看详情

C++“未在此范围内声明”编译错误及修改提示

】C++“未在此范围内声明”编译错误及修改提示【英文标题】:C++“wasnotdeclaredinthisscope”compileerrorandmodificationtips【发布时间】:2010-12-3015:47:10【问题描述】:我正在尝试修改此代码以使其在ArduinoMega上工作。我对C非常陌生,所... 查看详情

带有ndk平台错误帮助'_IOR'的c ++未在此范围内声明

】带有ndk平台错误帮助\\\'_IOR\\\'的c++未在此范围内声明【英文标题】:c++withndkplatformerrorhelp\'_IOR\'wasnotdeclaredinthisscope带有ndk平台错误帮助\'_IOR\'的c++未在此范围内声明【发布时间】:2013-04-2515:36:51【问题描述】:任何人都可以告... 查看详情