2016-05-16 3 views
0

Я не новичок в коде, но я нахожусь в Visual Studios. В моей жизни я не могу понять, почему я получаю следующие синтаксические ошибки. Код отказывается разрешить мне объявить объект Match m = new Match();.C++ Объект Необъявленный идентификатор

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 
+0

это может быть только C ** или ** C++, поэтому я удаляю тег C. –

+4

Используйте либо '#pragma once', либо macro include guard, а не оба. –

+5

'Match m = new Match();' -> 'Match * mPtr = new Match();'. или просто 'Match m;' –

ответ

2

Вы используете новый как Подпишите значение к типу не указателя. Если вы хотите указатель вы можете использовать:

Match* m = new Match(); 

иначе, просто объявить его как это:

Match m; 

Поскольку m не распознается как объект, вы получаете все остальные ошибки тоже.

Также вы должны использовать #pragma once вместо стандартных включите ограждения.

+0

Не все ошибки. Функция 'printStr' используется как переменная. Требуется '()'. – user4581301

+0

Спасибо, я удалил новое, но я все равно продолжаю получать ошибку 'Match': undeclared identifier. –

+0

Это означает, что компилятор не может найти ваш класс. Попробуйте то, что я предложил, удалив стандарт, включив охранники и просто используя '# pragma'. –

0

Оператор new возвращает указатель на инициализированный объект, используя данный конструктор. Что вы здесь делаете, это синтаксис java. Чтобы сделать это правильно, вам нужно создать указатель на объект такого типа: Match *m = new Match();. Затем вместо использования m.printStr вы должны использовать m->printStr, и вы не должны забывать удалить выделенную память, используя delete m. Или вы можете просто выделить его в стеке с помощью Match m(); или Match m = Match(). Затем вы можете использовать форму m.printStr, и вам не нужно беспокоиться об удалении памяти.

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