C++ 对象未声明标识符

Posted

技术标签:

【中文标题】C++ 对象未声明标识符【英文标题】:C++ Object Undeclared Identifier 【发布时间】:2016-05-16 19:31:05 【问题描述】:

我不是编码新手,但我是 Visual Studios。对于我的一生,我无法弄清楚为什么会出现以下语法错误。代码拒绝让我声明对象Match m = new Match();

Main.cpp

#include <iostream>
#include <string>
#include <time.h>
#include "Match.h"
#include "stdafx.h"

using namespace std;

const int NUM_TRIALS = 100000;

int main()

    Match m = new Match();
    printf("Program begin\n");
    for (int i = 0; i < 200; i++) 
        m = Match();
        printf("%s ... %s\n", m.to_str123().c_str(), m.printStr.c_str());
    
    printf("Program end.\n");
    return 0;

Match.h

#pragma once
#ifndef MATCH_H_
#define MATCH_H_
#include <string>
#include <iostream>
#include <time.h>

using namespace std;

#define HERO_PER_TEAM 3
#define NUM_HERO 10

class Match 
public:
    Match();
    ~Match();

    string to_str123();
    string printStr();

private:
    char teams[HERO_PER_TEAM * 2];
;

#endif

错误消息

Error   C2065   'Match': undeclared identifier  ConsoleApplication1 
Error   C2146   syntax error: missing ';' before identifier 'm' ConsoleApplication1 
Error   C2065   'm': undeclared identifier  ConsoleApplication1 
Error   C2061   syntax error: identifier 'Match'    ConsoleApplication1
Error   C2065   'm': undeclared identifier  ConsoleApplication1 
Error   C3861   'Match': identifier not found   ConsoleApplication1 
Error   C2065   'm': undeclared identifier  ConsoleApplication1 
Error   C2228   left of '.to_str123' must have class/struct/union   ConsoleApplication1 
Error   C2228   left of '.c_str' must have class/struct/union   ConsoleApplication1 
Error   C2228   left of '.printStr' must have class/struct/union    ConsoleApplication1

【问题讨论】:

它只能是C C++,所以我要去掉C标签。 使用#pragma once 或宏包含守卫,不能同时使用。 Match m = new Match(); --> Match* mPtr = new Match();。或者干脆Match m; using namespace std; 在标题中可以在很多方面毁掉你的一天。在这里阅读更多:***.com/questions/1452721/… m.printStr.c_str() 应该是 m.printStr().c_str()。除了缺少Match 的定义之外,指针混淆解决了所有问题,我无法重现。 【参考方案1】:

您正在使用 new 将值分配给非指针类型。如果你想要一个指针,你可以使用:

Match* m = new Match();

否则,只需像这样声明它:

Match m;

由于m 未被识别为对象,因此您也会收到所有其他错误。

您还应该能够使用#pragma once 代替标准的包含防护。

【讨论】:

并非所有错误。 printStr 函数被用作变量。需要() 谢谢,我删除了新的但是我仍然继续得到 'Match': undeclared identifier 错误。 这表明编译器找不到你的类。尝试我的建议,删除标准包含防护并仅使用 #pragma 是的,我也是。我不知道是什么原因造成的,VS是最糟糕的:( 你在哪一行得到未声明的标识符错误?【参考方案2】:

new 运算符使用给定的构造函数返回一个指向已初始化对象的指针。你在这里做的是java语法。要正确执行此操作,您必须创建一个指向该类型对象的指针:Match *m = new Match();。然后不要使用m.printStr,而是使用m-&gt;printStr,并且不要忘记删除使用delete m 分配的内存。或者您可以简单地使用Match m();Match m = Match() 在堆栈上分配它。那么你仍然可以使用m.printStr的形式,而且你不必担心删除内存。

【讨论】:

以上是关于C++ 对象未声明标识符的主要内容,如果未能解决你的问题,请参考以下文章

未声明 Visual c++ 标识符

我在 Visual Studio C++ 中遇到这些错误:“NuovoUtente”:未声明的标识符和“CercareUtente”:未声明的标识符 [关闭]

C++ 编程错误 |未声明的标识符

如何修复这个未声明的标识符? (C++)

C++ 循环依赖,未声明的标识符

Xcode 指示 C++ 不存在的已删除变量的未声明标识符错误