2

了解しました。私はJavaとPythonから来ているので、少し我慢してください。私はインターネットでc++でヘッダーファイルを使用する方法を学ぼうと探し回っていましたが、クラスを定義するまでは大丈夫でした。これが私のコードです。

notAClock.h

#ifndef NOTACLOCK_H_
#define NOTACLOCK_H_

namespace thenewboston {

class notAClock {
public:
    notAClock();
    virtual ~notAClock();
    int isAClock();
};

} /* namespace thenewboston */
#endif /* NOTACLOCK_H_ */

notAClock.cpp

    /*
 * notAClock.cpp
 *
 *  Created on: Dec 22, 2012
 *      Author: pipsqueaker
 */

#include "notAClock.h"

namespace thenewboston {

notAClock::notAClock() {
    // TODO Auto-generated constructor stub

}

notAClock::~notAClock() {
    // TODO Auto-generated destructor stub
}

int notAClock::isAClock() {
    return 0;
}
} /* namespace thenewboston */

そして最後に、私のメインファイル

#include <iostream>
#include "notAClock.h"
using namespace std;

int main() {
    cout << "program works" << endl;
    notAClock play;
}

Eclipseがこれをコンパイルしようとすると(私はCDTプラグインを使用しています)、エラーがスローされます。その関連部分は次のとおりです。

../src/main.cpp:13: error: 'notAClock' was not declared in this scope
../src/main.cpp:13: error: expected `;' before 'play'
make: *** [src/main.o] Error 1

私がこれから得ることができる最も多くは、notAClockがメインクラスで定義されていないということです。私は何が間違っているのですか?

-pipsqueaker117

4

2 に答える 2

4

名前空間内にクラスがあります。それを使用するには資格が必要です:

thenewboston::notAClock play;

usingまたは、クラスへの非修飾アクセスを許可するディレクティブを追加します。

using thenewboston::notAClock;
notAClock play;

または、using namespace名前空間全体をプルするディレクティブ:

using namespace std;
using namespace thenewboston;

int main() {
    cout << "program works" << endl;
    notAClock play;
}
于 2012-12-22T17:17:51.157 に答える
0

質問の「c++でヘッダーファイルを使用する方法」の部分に対処するために、いくつかの注意事項があります。

1)C ++のヘッダーファイルは、javaまたはpythonのパッケージインポートとは異なります。#includeをC ++に含めると、コンパイル中にファイルのテキストがソースファイルにインクルードされます(最適化であるプリコンパイル済みヘッダーは無視されます)。コンパイルされるファイルとともにコンパイルされるコンテンツ。つまり、プロジェクト全体で頻繁にインクルードされるヘッダーファイルは、何度もコンパイルされることになります。これが、C++で#includesを最小限に抑えることが望ましい理由の1つです。

2)スタイルの観点から、多くの人は、パブリックインターフェイスクラス宣言(たとえば、「pimpl」イディオムを参照)のみをパブリックヘッダーファイルに保持し、具体的なクラス定義を.cppファイルに配置することを好みます。これにより、クラスの実装の内部の詳細がパブリックインターフェイスから物理的に分離されます。クラスの実装が変更された場合、再コンパイルする必要があるのは実装コードを含むファイルのみです。クラスの実装が広範囲のヘッダーファイルに配置されている場合、開発中にビルドがより長く発生するだけでなく、関連のないコードがクラスの実装を「混乱」させ、困難を引き起こす可能性が高くなります。 -デバッグの問題。

于 2012-12-22T18:50:16.620 に答える