c ++错误:尝试创建对象时出现“未声明的标识符”。标题问题?

时间:2012-03-22 18:19:29

标签: c++ object header-files undeclared-identifier

我想我的包装有问题,但我似乎无法找到它我做错了什么。我在w7 64位系统上使用visual studio 10。

我得到的编译错误:

testd.cpp(9): warning C4018: '<' : signed/unsigned mismatch
testd.cpp(21): warning C4018: '<' : signed/unsigned mismatch
testd.cpp(36): error C2065: 'tmp' : undeclared identifier
testd.cpp(37): error C2065: 'tmp' : undeclared identifier
testd.cpp(37): error C2227: left of '->getTestId' must point to class/struct/union/generic type
type is ''unknown-type''
testd.cpp(40): error C2065: 'tmp' : undeclared identifier
testd.cpp(41): error C2065: 'tmp' : undeclared identifier

因此,每当我尝试制作一个新对象(tmp)时,他都说“未声明的标识符”。 我的猜测是他无法达到Test的课程定义(aldho他没有警告我), 但我不知道为什么......我将代码减少到最小,以便只保留错误功能。提前感谢您的时间

test.h:类Test的定义,包含2个atributes,getters,setter,constructors和析构函数

#pragma once
class Test
{
private:
    int myTestId;
    string myTestNaam;    
public:
    Test();
    Test(string TestNaam,int TestId);
    ~Test();
    int getTestId();
    string getTestNaam();
    void setTestId(int TestId);
};

* test.cpp:类Test的函数定义

#include "stdafx.h"
#include "headers/Test.h"
Test::Test() {setTestId(0);}
Test::Test(string TestNaam, int TestId) {setTestId(TestId);}
Test::~Test() {}    
void Test::setTestId(int TestId) {myTestId=TestId;}
int Test::getTestId() {return myTestId;}

testd.h:类Testd的定义,带静态向量和静态函数

#pragma once
#include "Test.h"
class TestD
{
private:
    static vector<Test*> Testen;
    static int getPosition(int ID);
public:
    static Test* newTest(Test*);
    static Test* getTest(int ID);
};

testd.cpp:类Testd的函数定义

#include "StdAfx.h"
#include "headers/Test.h"
#include "headers/Testd.h"
vector<Test*> TestD::Testen = vector<Test*>();
Test* TestD::getTest(int ID)
{for(int i =0; i < Testen.size(); i++)
    {Test* tmp = Testen.at(i);
    if(tmp->getTestId() == ID)
    return tmp;
}
return 0;
}

int TestD::getPosition(int ID)
{for(int i = 0; i < Testen.size(); i++)
    {Test* tmp = Testen.at(i);
    if(tmp->getTestId() == ID)
    return i;
}
return -1;
}

Test* TestD::newTest(Test* Test)
{if(Test->getTestId()==-1)
    {Test* tmp = Testen.at(Testen.size()-1);
    int newId = tmp->getTestId()+1;
    Test->setTestId(newId);
    }
    Test* tmp = getTest(Test->getTestId());
    if(tmp==0)
{Testen.push_back(Test);
    return Test;
}
}

最后我加入了我的Stdafx.h

#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
//some includes are not used in the files I mentioned here, but other files need them

感谢您的帮助,我希望我的英语不好,不会冒犯您。

2 个答案:

答案 0 :(得分:3)

首先,您无法定义变量并将其命名为与现有类型相同的方式:

Test* TestD::newTest(Test* Test)

重命名该测试变量。

然后导致签名无符号错配警告,因为您要将std::vector::size的返回值与size_t进行比较:

int

for(int i =0; i < Testen.size(); i++) 的类型修改为size_t,然后删除该警告:

i

答案 1 :(得分:0)

通常在声明指针时必须用new分配,比如

Test *temp=new Test(...);