0

現時点では、ショップ、メイン、選択画面など、実際に何かを行う機能は 9 つほどあります。通貨を選択画面でグローバル化したいのですが、#inculde "shop.cpp" を実行しても機能しません。shop.obj が既に定義されているというエラーが表示されるだけです。ショップのコードが少し長いため、グローバル化された変数を実際に使用する場所まで、最初の数行を投稿します。

#include <iostream>
#include "gp.cpp"
using namespace std;

double smallNet = 0, bronzeAxe = 0;
int availableGP;
int skillselection();

int shop()
{
    int itemPurchase = 0;
    double shopCont = 0;

    cout << " \n\n\n\nWelcome to the General Store.";
    cout << "\n We sell many supplies, you";
    cout << "\n will need throughout your";
    cout << "\n adventure! Please take a look!";

    cin.get();
    cin.get();

    while (shopCont != 2)
    {
        system("cls");

        cout << "________________________________" << endl;
        cout << "|_______Item_______|___Cost____|" << endl;
        cout << "| Small Net     (1)| 10gp      |" << endl;
        cout << "| Bronze Axe    (2)| 100gp     |" << endl;
        cout << "|__________________|___________|" << endl;
        cout << "Gold: " << availableGP << endl;

この次のコード スニペットは、gp.cpp からのものです。

#include <iostream>
using namespace std;

int gp()
{
    int availableGP = 112;
    return availableGP;
}

選択画面から呼び出されるようにしたいと言ったのは知っていますが、コードはコードボックスに入っていません:\だから、これは見栄えが悪くなります。最初に言ったように、私はコードに関してはかなり初歩的なので、行って std::iostream=array::index などを入れてはいけません笑

コンパイルしようとすると表示されるエラー メッセージ: shop.obj : error LNK2005: "int __cdecl gp(void)" (?gp@@YAHXZ) already defined in gp.obj

その「cdecl gp(void)」とは正確にはどういう意味ですか? 私のプログラムにはボイドがありません。また、?gp@@YAHXZ の意味もわかりません :\ C++ のクラスをもう一度受講する必要があると感じています。なぜなら、先生は私たちに 3 回しかプログラムをさせていないからです。それは 12 週目に行われます...講義...ちょっと面倒

これが愚かに繰り返される質問である場合は申し訳ありませんが、.h ファイルや conio など、誰もが使用する特別なものが何であるかはわかりません :\ メインで機能するものを作成するだけで済みました。だから...これはそれからの大きなステップアップです...退屈して、これをやったらどうなるかを理解したかったからです...

誰かが私が探しているダミーの答えをくれたらありがとう:)

4

2 に答える 2

0

C および C++ では、コードは通常、ヘッダー ファイル実装ファイルに分割されます。通常、ヘッダーには拡張子.h(または.hhC .hpp++ の場合は または ) があり、実装ファイルには.c.ccまたは.cpp.

実装ファイルは、実際にコンパイラに渡されるものです。一方、ヘッダー ファイルは#include実装ファイルに組み込まれます。#includeコンパイラ(技術的にはプリプロセッサ)に、ヘッダーファイルを実装に文字通りコピーアンドペーストするように指示します。1 つの特定のヘッダー ファイルが多くの実装に含まれる可能性があり、ヘッダーには必要に応じて他のヘッダーを含めることができます。

通常、関数宣言をヘッダー ファイルに入れ、関数定義を実装ファイルに入れます。宣言は次のようになります。

int multiply(int a, int b);

つまり、本体がありません[1]。一方、定義には、次のように中括弧で囲まれた関数本体があります。

int multiply(int a, int b)
{
    return a * b;
}

すべての宣言が同一であれば、関数を何度でも宣言できます。C++ (および C の新しいバージョン) では、関数を呼び出す前に関数を宣言する必要があります。しかし、重要なのは、定義を 1 つしか提供できないということです。これはOne Definition Ruleと呼ばれるものであり、ここで問題を引き起こしています。

あなたがする必要があるのは、の宣言int gp()ヘッダーファイルに入れることです(たとえば、と呼ばれ、gp.hppそれ#includeを定義するファイルにshop().

現状では、コンパイラは最初に をコンパイルしgp.cpp、 のコードを作成しますint gp()。次に、他のファイルにコピー アンド ペーストgp.cppし、2 番目のコードを作成しようとしますint gp()。これらを実行可能ファイルに結合しようとすると、同じ名前の 2 つのもの (技術的にはシンボルと呼ばれます) があることがわかり、表示されているリンカー エラーが発生します。

(後で、キーワードを使用して定義をヘッダー ファイルに入れたいと思うかもしれませんがinline、現時点では、コードを分離するのがおそらく最善です。)

[1]: 純粋主義者向け: はい、わかっています。定義は宣言でもあります :-)

于 2013-11-11T08:15:54.840 に答える
0

グローバル変数を避ける方が良いという事実を別として(Singletonパターンなどを考えた方が良い)、問題はgp()関数を2回コンパイルしていることです(1回はgp.cppをコンパイルするとき、もう1回はgp.cppをコンパイルするとき)別のファイルに含まれています)。それがそのエラーの意味です。これを解決するには、次のようなヘッダー ファイル "gp.h" を作成します。

#ifndef __GP_H__
#define __GP_H__

int gp();

#endif

次に、両方の.cppファイルに、次を使用してそのヘッダーを含めます

#include "gp.h"

(#ifndef などは、ヘッダー ファイルが同じファイルに 2 回含まれないようにするためのものです)。

これにより、関数を宣言していますが、「実装」していないため、コンパイラはバイナリ コードを 1 回だけ生成します。

于 2013-11-11T08:11:08.153 に答える