1

ここで初歩的な質問があります。私は C++ の構造と構文に頭を悩ませていますが、ちょっとした壁にぶつかりました。私は自分のコンセプトから何かが欠けていることを知っています。最初に、状況を説明するのに役立つ小さなコードを示します。

Control.h

#pragma once
#ifndef CONTROL_H
#define CONTROL_H

class Control
{
    public:
        Control();
        ~Control();
    private:
    public:
};

#endif /*CONTROL_H*/

コントロール.cpp

#include "Control.h"
#include "Hello.h"

Hello helloObj;

Control::Control()
{
}

Control::~Control()
{
}

int main()
{
    int a = helloObj.HelloWorld();
    return 0;
}

こんにちは。

#pragma once
#ifndef HELLO_H
#define HELLO_H

class Hello
{
    public:
        Hello();
        ~Hello();
    private:
    public:
         int HelloWorld(void);
};
#endif /*HELLO_H*/

こんにちは.cpp

#include "Hello.h"

Hello::Hello()
{
}

Hello::~Hello()
{
}

int HelloWorld()
{
    return 5;
}

OSX 10.7でg ++を使用してcontrol.cppをコンパイルしようとすると、

Undefined symbols for architecture x86_64:
      "Hello::Hello()", referenced from:
              __static_initialization_and_destruction_0(int, int)in cccZHWtd.o
      "Hello::~Hello()", referenced from:
              ___tcf_1 in cccZHWtd.o
      "Hello::HelloWorld()", referenced from:
              _main in cccZHWtd.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

それはコンパイラ、私のコード、または何が起こっているのかという私の概念ですか? 何かを正しくインスタンス化していませんか?

これをより詳細に説明しているリンクをいただければ幸いです。

最終的には、別のクラスで関数を実行して結果を返すことができるようにしたい...通常のオブジェクト指向、プログラムのモジュール化を維持する....

4

3 に答える 3

1

発生しているエラーは、コンパイル エラーではなくリンク エラーです。
リンカーは、上記の関数の定義を見つけることができないため、エラーを報告します。Hello.cppプロジェクトに関数定義を含むファイルが 含まれていないようです。

Hello.cppがプロジェクトに含まれていて、プロジェクトの一部であることを確認してください。または
、コンパイルとリンクにコマンド ラインを使用している場合はHello.cpp、コマンド ラインのファイル名で指定したことを確認してください。

于 2012-02-17T02:42:53.333 に答える
0

問題のほとんどは、私が g++ に慣れていないことです (Als に感謝します)。構文の問題もほとんどありませんでした (Brain に感謝します)。

これは修正された(構造の概要のために少し肥大化していますが)コードとg ++コマンドです

Control.h

#pragma once
#ifndef CONTROL_H
#define CONTROL_H

class CONTROL
{
    private:
       //nothing defined yet...
    public:
        Control(); //default constructor
        ~Control(); //default destructor
};
#endif /*CONTROL_H*/

コントロール.cpp

#include "Hello.h"
#include "Control.h"

Hello helloTest; //instantiates the Hello Object

Control::Control()
{
}

Control::~Control()
{
}

int main()
{
    helloTest.HelloWorld();
    return 0;
}

こんにちは。

#pragma once
#ifndef HELLO_H
#define HELLO_H

class Hello
{
    private:
        //nothing defined yet
    public:
        Hello(); //default constructor
        ~Hello(); //default destructor

        void HelloWorld();
};
#endif /*HELLO_H*/

こんにちは.cpp

#include "Hello.h"
#include <iostream> //so we can use 'cout'

using namespace std;

Hello::Hello()
{
}

Hello::~Hello()
{
}

void Hello::HelloWorld()
{
    std::cout << "Hello lovelies!\n"; //The magic word.
}

次に、g ++を次のように実行します

g++ -o こんにちは ./Control.cpp ./Hello.cpp

g++ [オプション] [出力ファイル名] [入力ファイル]

于 2012-02-17T17:19:40.483 に答える
-1

初めに:

    public:
    Hello();
    ~Hello();
    private:
    public:

は無意味です。クラスはデフォルトでプライベートに設定されており、それを 2 回パブリックにする必要はありません。さらに、プライベート メンバーが存在しない場合は、それを行うことができるかどうかもわかりません。 :-) )

質問に答えるために(推測での免責事項:私はGCCに100%精通していません):

これはリンカ エラーです。コンパイラが HelloWorld(void); の定義を見つけられないために発生している可能性があります。説明させてください:

あなたが書いたヘッダーファイルに:

int HelloWorld(void);

ただし、.cpp に次のように記述します。

int HelloWorld()
{
   return 5;
}

関数 (またはこの場合はクラス内にあるためメソッド) の引数は、ヘッダーとソースでまったく同じである必要があり、名前を変更することさえできません (または、少なくとも私が使用する VC++ では変更できません; 私はgcc の経験がほとんどない) ため、これは次のように入力することで解決できる場合があります。

int HelloWorld(void)
{
   return 5;
}

次へ (免責事項、私は前処理者に 100% 精通しているわけではありません):

#pragma once pre-proccsor タグも使用していますが、私は使用しませんが、ファイルを 1 回しかインクルードできず、Hello.h と Control.h を 2 回インクルードしたことを意味すると思います。プリプロセッサですが、コメントアウトしました

HELLO_H

CONTROL_H

于 2012-02-17T03:02:19.520 に答える