Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法得到C++;不同文件上的类是否将方法定义保留在类中?_C++ - Fatal编程技术网

C++ 有没有办法得到C++;不同文件上的类是否将方法定义保留在类中?

C++ 有没有办法得到C++;不同文件上的类是否将方法定义保留在类中?,c++,C++,文件:A.cpp 文件:A.hpp 我有一个java背景,我从C++移到C++。我坚持每个文件保留一个类的想法,这样就有了一个干净的代码。然而,我不喜欢使用范围解析操作符的想法,这使得从类中删除类定义看起来很难看 我有没有办法将类定义保持在类构造中 注意:我已经访问了,但没有回答我的问题。是的,您可以在标题中内联定义它。然后,您可以包含所有代码 class A { void increment() { i++; } }; 然而,这也带来了一个后果。如果对

文件:A.cpp

文件:A.hpp

<>我有一个java背景,我从C++移到C++。我坚持每个文件保留一个类的想法,这样就有了一个干净的代码。然而,我不喜欢使用范围解析操作符的想法,这使得从类中删除类定义看起来很难看

我有没有办法将类定义保持在
构造中


注意:我已经访问了,但没有回答我的问题。

是的,您可以在标题中内联定义它。然后,您可以包含所有代码

class A
{
    void increment()
    {
        i++;
    }
};
然而,这也带来了一个后果。如果对实现进行更改,则必须完全重新编译包含该头的每个文件(要使用该文件)


在这种情况下,我们不应该假设语言A只是语言B,只是有一些细微的变化。使用两个文件的头/实现模式是C++的一个非常重要的部分,在试图假装它是java和使用java的一个文件方法时,会有很多麻烦。

虽然它不是非常干燥,但我认为分离的定义和实现是C++中通常如何实现的。p> 无论如何,您可以将所有类代码移到头文件中,但最终会增加编译时间,因为每个使用A的cpp文件都会编译整个代码。这也会增加二进制文件的大小。如果你有很多课程使用了许多其他类,你可能会被编译的时间和大小所累,很多时候如果你用C++的方式来编译。(如果你的链接器不是很聪明,但我想所有的优化都是在编译时完成的)


您也可以将所有的类定义移动到cpp文件中,但我想这会在几乎所有非平凡的情况下更加混乱。

自包含?我想你把两个文件都复制错了。。。无论如何,在大多数情况下,没有什么能阻止您将整个类定义内联,但是耦合性更强,编译时间更长。因此,它是非常令人沮丧的。当在罗马,做罗马人。这将涵盖在任何初学者C++书籍。事实上,大多数书籍都会在教你如何将一个类定义分离为源文件/头文件之前教你如何定义一个类。正如上面指出的,你的代码是错误的——你在两个文件中都有相同的代码。我不同意这样的逻辑,即每个文件保留一个类更干净。通过这样做,您将迫使代码的任何读者仔细阅读所有与他们无关的实现细节,以确定他们应该使用的接口。通过分离,您可以将接口和文档放在标题(代码用户想要的部分)中,并将实现放在源代码中。C++没有完美地完成这一点,但是如果你使用的话,你可以靠近。或者你可以使用<代码>内联关键字将类的实现放在类定义之后,但是我觉得这是对来自java的人的更清晰的注释。
#ifndef HEAD_H
#define HEAD_H
class A
{
private:
    int i;
public:
    void increment();
    int get_i();
};
#endif
class A
{
    void increment()
    {
        i++;
    }
};