多个头文件和类之间有什么关系?

时间:2012-02-17 02:39:54

标签: c++ class header modular

我这里有一个noob问题。 我正在理解C ++结构和语法,我已经碰到了一点墙。 我知道我错过了我的概念。所以首先要用一些代码来帮助描述这种情况。

Control.h

#pragma once
#ifndef CONTROL_H
#define CONTROL_H

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

#endif /*CONTROL_H*/

Control.cpp

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

Hello helloObj;

Control::Control()
{
}

Control::~Control()
{
}

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

Hello.h

#pragma once
#ifndef HELLO_H
#define HELLO_H

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

HELLO.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

是编译器,我的代码还是我的概念是什么? 我没有正确地实例化吗?

任何更详细描述这一点的链接都将受到赞赏。

最终我希望能够在另一个类中运行一个函数并返回结果...正常的OO,保持程序模块化的东西......

3 个答案:

答案 0 :(得分:1)

您获得的错误是链接错误而不是编译错误 链接器无法找到所述功能的定义。因此它会报告错误。看来你没有在项目中包含包含函数定义的Hello.cpp文件。

确保Hello.cpp包含在您的项目中,并且是项目的一部分或者 如果使用命令行进行编译和链接,请确保在命令行的文件名中指定了Hello.cpp

答案 1 :(得分:0)

大多数问题是我不熟悉,因为我应该使用g ++(感谢Als)。 语法问题也很少(感谢大脑)。

这是更正的(albiet略微膨胀的结构概述)代码和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*/

Control.cpp

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

Hello helloTest; //instantiates the Hello Object

Control::Control()
{
}

Control::~Control()
{
}

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

Hello.h

#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*/

HELLO.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 Hello ./Control.cpp ./Hello.cpp

g ++ [选项] [输出文件名] [输入文件]

答案 2 :(得分:-1)

首先:

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

毫无意义,一个类默认为private,并且不需要创建它 公开两次也不知道你是否可以做到这一点,如果你没有私人成员私人不应该在那里(不试图只是一些建议:-))

现在回答这个问题(猜测免责声明:我不是100%的GCC家庭成员):

这是一个链接器错误,可能是因为 编译器找不到定义 的HelloWorld(无效);. 让我解释一下:

在你的头文件中写道:

int HelloWorld(void);

但是在你的.cpp中写道:

int HelloWorld()
{
   return 5;
}

函数的(或者在这种情况下是方法,因为它在一个类中) 你需要在头文件和源代码中完全相同的参数 甚至不能改变名称(或者至少你不能用VC ++改名) 我用的是什么我对gcc的经验很少,所以这可能是可以解决的 输入

int HelloWorld(void)
{
   return 5;
}

接下来(免责声明我不是100%熟悉预处理器):

你也使用#pragma once pre-proccsor标签,但我不使用它 我相信这意味着你只能包含一个文件,并且你已经包含了Hello.h和Control.h两次,就像我说我不是pre-proccsor的专家但你注释掉了

HELLO_H

CONTROL_H

相关问题