![](/img/trans.png)
[英]c++ functions defined outside of class in separate .cpp file and makefile linking
[英]Is it a good idea to implement C++ class functions outside of the class' cpp file?
假设我有一个main.cpp,class1.cpp,class1.h以及其他未指定的头文件:
class1.h
#pragma once
class Class1 {
public:
Class1(int val);
void pubFunc();
private:
int val1;
void privFunc();
}
class1.cpp
#include "class1.h"
Class1::Class1(int val) {
val1 = val;
}
void Class1:pubFunc() {
if (val1 > 0)
privFunc();
}
main.cpp中
#include "class1.h"
#include "anotherclass.h"
AnotherClass ac;
int main() {
Class1 c1(10);
c1.pubFunc();
}
Class1::privFunc() {
ac.doSomething;
}
我希望Class1::pubFunc()
本质上触发另一个可以利用AnotherClass
,而不将其标头包含在class1.cpp中 。 这是我想到的方法,但是感觉杂乱无章,而且我不太热衷于将类实例放在main()
。 我可以想到的另一种方法是使Class1::pubFunc()
返回一个string
,该string
映射到一个函数,但是我不知道这样做是否更好。
误解。 C ++中的类不需要拥有自己的 *.cpp
文件,并且出于实用的原因,要避免拥有许多微小的*.cpp
文件(而宁愿使用较少的*.cpp
文件,每个文件都定义了几个相关的类和函数,因此稍大)。
给定的翻译单元 (例如*.cpp
文件和#include
-ing的所有头文件 )可以(通常确实)定义和声明几个 class
-es和函数。
实际上,您可以使用几个标准容器或标准C ++头文件提供的其他标准C ++设施(例如, <memory>
智能指针, <string>
, <vector>
, <algorithm>
排序函数)使用C ++进行编码等等。 强大的C ++标准库是使用C ++(例如,代替C)进行编码的原因之一。 因此,您可能会#include
几个标准标头,例如<vector>
或<map>
。 标准标头非常复杂:在我的Linux机器上, #include <vector>
通常扩展到一万多个包含行(这是C ++代码编译缓慢的原因之一)。 因此,有很多一百行的小C ++文件(其中每个都包含一些标准标头)是不明智的(但有可能的),因为包含#include <vector>
和200行C ++代码的小yourcode.cpp
文件被扩展为更多:编译器从<vector>
解析大约10000行代码(LOC),并从您的代码中解析200LOC,因此总共解析了10200 LOC。
顺便说一句,你可以问你的编译器,让您的翻译单元的预处理形式(与海湾合作委员会 ,利用g++ -C -E yourcode.cpp > yourcode.ii
)和看(用一个编辑器或寻呼机),那里面yourcode.ii
。
(您的示例不是真正的C ++ 11代码;实际上,它应经常使用标准容器和丰富的C ++标准库的其他一些功能-智能指针,线程,标准算法...,但不是)
因此,我建议您的*.cpp
至少包含一千或两个C ++源代码行,并且它们当然可以定义几个相关的类(和函数)。 在某些情况下,单个C ++ class
可能在多个 C ++文件中实现(因为该类具有很多方法)。
顺便说一句,在你的C ++类,很多小功能(包括成员函数)都是内联,你会在一些你的头文件中定义它们。
您的问题是先前有问题的决定的结果-使用全局变量在main()
和Class1
之间共享AnotherClass
的实例。
如果您通过使用回调或接口打破了这种依赖性,那么将Class1
成员函数定义分散到多个编译单元中的需求也将消失。
这是解决依赖关系的一种方法:
class1.h
#include <functional>
class Class1
{
public:
Class1(int val, std::function<void(void)> callback);
void pubFunc(void);
private:
std::function<void(void)> do_the_thing;
int val1;
};
class1.cpp
#include "class1.h"
Class1::Class1(int val, std::function<void(void)> callback)
: val1(val), do_the_thing(std::move(callback))
{
}
void Class1:pubFunc(void)
{
if (val1 > 0)
do_the_thing();
}
main.cpp中
#include "class1.h"
#include "anotherclass.h"
int main(void)
{
AnotherClass ac;
Class1 c1(10, std::bind(&AnotherClass::doSomething, ac));
// can also write as [](){ ac.doSomething(); }
c1.pubFunc();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.