我怎么可能从一个尚未定义某些成员方法的类中创建一个实例? (C ++)

时间:2018-02-13 15:02:04

标签: c++ xcode

我对C ++比较陌生,所以我在Xcode中测试了一些东西,发现了一个非常奇怪的东西。 这是我的'Testing.h'文件

#ifndef Testing_h
#define Testing_h
class Testing{
private:
    int a;
public:
    Testing(int a=3);
    void hey(int b);
};
#endif

这是我的'Testing.cpp'文件

#include "Testing.h"
Testing::Testing(int a){
    a = 4;
}

最后,这是'main.cpp'文件

#include <iostream>
#include "Testing.h"
using namespace std;

int main(){
Testing a;
//Apparently not completing the definitions of every abstract methods in the class is not a problem
}

我只在'Testing.h'中声明了'void hey(int b)',但没有在'Testing.cpp'中定义它。所以我想知道编译器如何成功编译'main.cpp'而没有'void hey(int b)'的足够信息。提前谢谢!

2 个答案:

答案 0 :(得分:4)

因为你永远不需要有hey()的定义。

您可以通过调用来定义定义,例如:

a.hey(42);

您会发现链接器并不太高兴,因为hey是未定义的引用。

答案 1 :(得分:0)

  

Testing a;//Apparently not completing the definitions of every abstract methods in the class is not a problem

您使用默认值a=3定义了构造函数,但同时调用构造函数参数和类参数是不好的做法。 相反,你可以这样写:

//Testing.h
#ifndef Testing_h
#define Testing_h
using namespace std;
class Testing{
private:
    int number;
public:
    Testing(int a=3): number(a = 4){}//it's the same as your implementation in cpp file
    void hey(int b);
    int getNumber() {return number;}
};
#endif


//main.cpp
#include <iostream>
#include "Testing.h"
int main()
{
    Testing object;
    cout<<object.getNumber();// returns 4

    return 0;
}

为什么hey会编译?

在构建项目期间,编译器会通过验证语法将源代码转换为目标代码。在该过程之后,链接器检查由整个短语标记的定义。源代码是从提供的每个文件中编译的。链接器并不关心实现存在,只有在程序使用方法时才会查找它。因此即使没有实现hey您的程序也会编译。

上次评论

不鼓励包含.cpp文件而是使用标头。有时您可能会自己进入导致编译器错误的相同函数的多个定义。