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->printStr
,并且不要忘记删除使用delete m
分配的内存。或者您可以简单地使用Match m();
或Match m = Match()
在堆栈上分配它。那么你仍然可以使用m.printStr
的形式,而且你不必担心删除内存。
【讨论】:
以上是关于C++ 对象未声明标识符的主要内容,如果未能解决你的问题,请参考以下文章
我在 Visual Studio C++ 中遇到这些错误:“NuovoUtente”:未声明的标识符和“CercareUtente”:未声明的标识符 [关闭]