0

ユーザー定義オブジェクト型の配列を扱うクラス プロジェクトがあります。ChemicalData.cpp ファイル内のすべての関数 (最終的にはさらに増える予定です) は、この配列にアクセスできる必要があります。したがって、問題の配列は、「extern」構文のヘッダー ファイルにあります。

#include <string>
#include "Chemical.h"

const int ARRAY_SIZE = 2000; 
extern Chemical chemArray[ARRAY_SIZE];

void start();
void arrayMethod(Chemical[]);

私の cpp ファイルでは、配列を作成して関数を呼び出しました。

#include "ChemicalData.h"
#include "Chemical.h"
#include <string>
using namespace std;


void start()
{
    Chemical chemArray[ARRAY_SIZE];

    arrayMethod(chemArray);
}

void arrayMethod(Chemical[] chemArray)
{
    Chemical chem1 = Chemical();
    chemArray[i] = chem1;
}

ここに私のChemical.hがあります:

#include <string>
#if !defined(CHEMICAL_H)
#define CHEMICAL_H
using namespace std;

class Chemical
{ 
private:
    string chem;

public:
    Chemical();
};
#endif

適切な測定のための Chemical.cpp:

#include "Chemical.h"
#include <string>
using namespace std;

string chem;

Chemical::Chemical()
{
  chem = "";
}

しかし、コンパイラは「'chemArray' への未定義の参照」というエラーをスローします。私は何を間違っていますか?

4

3 に答える 3

6
void start()
{
    Chemical chemArray[ARRAY_SIZE];

    arrayMethod(chemArray);
}

chemArray関数を開始するにはローカルです。関数の外に移動します。

Chemical chemArray[ARRAY_SIZE];

void start()
{
    arrayMethod(chemArray);
}

サイドノート; グローバルは悪いので、これをクラスにラップして、その配列をそのクラスのインスタンス メンバーにすることができます。

于 2013-03-25T21:45:46.530 に答える
3

ChemArray を関数内の一時変数にすることはできません。extern はグローバル変数に使用されます。関数を入力するたびに新しい chemArray が作成されるため、それを関数の外側に削除すれば問題ありません。

Chemical chemArray[ARRAY_SIZE]; 

void start()
{

    arrayMethod(chemArray);
}
于 2013-03-25T21:45:58.623 に答える
-1

chemArray[ARRAY_SIZE]代わりに、ヘッダー ファイル内に Chemical を入れることはできませんか? 次に、前方宣言しますか?

于 2013-03-25T21:47:16.753 に答える