1

我在这里有一个菜鸟问题。我对 C++ 结构和语法有所了解,但遇到了一些困难。我知道我的概念中遗漏了一些东西。因此,首先编写一些代码来帮助描述情况。

控制.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;
}

你好.h

#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

是编译器、我的代码还是我对正在发生的事情的概念?我没有正确实例化某些东西吗?

任何更详细地描述这一点的链接将不胜感激。

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

4

3 回答 3

1

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

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

于 2012-02-17T02:42:53.333 回答
0

大多数问题是我不熟悉 g++(感谢 Als)。语法问题也很少(感谢 Brain)。

这是更正的(结构概述略显臃肿)代码和 g++ 命令

控制.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;
}

你好.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*/

你好.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:

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

现在回答这个问题(猜测免责声明:我不是 100% 熟悉 GCC):

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

在您的头文件中,您写道:

int HelloWorld(void);

但是在你的 .cpp 中你写:

int HelloWorld()
{
   return 5;
}

函数的(或者在这种情况下是方法,因为它在一个类中)的参数需要在头文件和源代码中完全相同,你甚至不能更改名称(或者至少你不能使用我使用的 VC++;我对 gcc 几乎没有经验)所以这可以通过键入来解决

int HelloWorld(void)
{
   return 5;
}

下一步(免责声明我不是 100% 熟悉 pre-proccsor):

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

你好_H

控制_H

于 2012-02-17T03:02:19.520 回答