0

インクルードで何か間違っていると思いますが、何が間違っているのかわかりません。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 のクラス定義に到達できないと思います (彼は私に警告していません) が、その理由がわかりません. . お時間をいただきありがとうございます

test.h: 2 つの属性、getter、setter、コンストラクタ、およびデストラクタを持つクラス Test の定義

#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

助けてくれてありがとう。私の拙い英語であなたを怒らせなかったらいいのにと思います。

4

2 に答える 2

3

まず、変数を定義して、既存の型と同じように名前を付けることはできません。

Test* TestD::newTest(Test* Test)

その Test 変数の名前を変更します。

std::vector::size次に、の戻り値を比較しているため、符号付き/符号なしの不一致警告が発生しsize_tますint

for(int i =0; i < Testen.size(); i++)

そのitype を size_t に変更すると、その警告が削除されます。

for(size_t i =0; i < Testen.size(); i++)
于 2012-03-22T18:25:34.223 に答える
0

通常、ポインターを宣言するときは、次のように new で割り当てる必要があります

Test *temp=new Test(...);
于 2012-03-22T18:47:19.743 に答える