我这里有一个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,保持程序模块化的东西......
答案 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