- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,让我先说这可能是非常主观和有争议的,可能不属于这里(如果感觉是相互的,请随时关闭)。话虽如此,我正在查看一些代码,我想采用一种标准的组合方法,因为似乎不同的人有不同的风格——所以,这是我到目前为止看到的风格(可能还有更多..) 我关注的特定组合问题是类 B
拥有类 A
的实例,但是,A
需要知道实例,以便它可以调用 B
的方法。
#include <iostream>
using namespace std;
namespace forward
{
class B;
class A
{
public:
A(B& b);
private:
B& inst;
};
class B
{
public:
B() : inst(*this) {}
void foo() { cout << "forward::B::foo()" << endl; }
private:
A inst;
};
A::A(B& b) : inst(b) { inst.foo(); }
}
namespace interface
{
struct IB
{
virtual void foo() = 0;
};
class A
{
public:
A(IB* b) : inst(b) { inst->foo(); }
private:
IB* inst;
};
class B : public IB
{
public:
B() : inst(this) {}
virtual void foo() { cout << "interface::B::foo()" << endl; }
private:
A inst;
};
}
namespace templated
{
template <typename IB>
class A
{
public:
A(IB& b) : inst(b) { inst.foo(); }
private:
IB& inst;
};
class B
{
public:
B() : inst(*this) {}
void foo() { cout << "templated::B::foo()" << endl; }
private:
A<B> inst;
};
}
int main(void)
{
forward::B b1;
interface::B b2;
templated::B b3;
return 0;
}
从这里,我可以看到以下内容(不完整):
前向声明减少需要在 header 中包含 header ,但是您不能使用在该 header 中向前声明的类型 - 即在使用时必须提供完整的类型。
接口(interface)额外的包袱(基类构造、虚函数调用等)
模板化除了编译问题(即荒谬的错误消息等),我看不出有任何问题
现在,我更喜欢模板化方法 - 我认为它很干净并且具有强制编译时间的优点。所以问题的关键是,这种方法在技术上是否存在问题?如果没有,您为什么要采用其他两种方法?
编辑:我认为这个简单的例子没有帮助,在这个特定的例子中,B 是一个资源管理器,并且拥有各种相互关联的组件 (A) - 例如各种网络连接等。所有子组件都可以访问通过 B 彼此 - 整个系统曾经是一堆单例......所以 A 知道 B 的唯一原因是它提供对 A 需要的其他一些组件的访问......
有趣的是,大多数答案都推荐转发,但我仍然不明白为什么这比模板化方法更有优势——除了简单的通用函数之外,是否存在对在代码中使用模板的内在恐惧?
最佳答案
您是否考虑过解决基本设计问题,这样您就没有需要知道其父级才能运行的成员?如果没有关于这种安排的动机的更多信息,很难推荐更好的替代方案,但基本问题似乎是设计问题,而不是技术问题。
编辑听起来您正在寻找 Service Locator .查看它,看看它是否对您的设计问题没有帮助。
关于c++ - C++ 中的组合模式,是否有首选方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4760393/
对此感到疯狂,真的缺少一些东西。 我有webpack 4.6.0,webpack-cli ^ 2.1.2,所以是最新的。 在文档(https://webpack.js.org/concepts/mod
object Host "os.google.com" { import "windows" address = "linux.google.com" groups = ["linux"] } obj
每当我安装我的应用程序时,我都可以将数据库从 Assets 文件夹复制到 /data/data/packagename/databases/ .到此为止,应用程序工作得很好。 但 10 或 15 秒后
我在 cc 模式缓冲区中使用 hideshow.el 来折叠我不查看的文件部分。 如果能够在 XML 文档中做到这一点就好了。我使用 emacs 22.2.1 和内置的 sgml-mode 进行 xm
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
根据java: public Scanner useDelimiter(String pattern) Sets this scanner's delimiting pattern to a patt
我读过一些关于 PRG 模式以及它如何防止用户重新提交表单的文章。比如this post有一张不错的图: 我能理解为什么在收到 2xx 后用户刷新页面时不会发生表单提交。但我仍然想知道: (1) 如果
看看下面的图片,您可能会清楚地看到这一点。 那么如何在带有其他一些 View 的简单屏幕中实现没有任何弹出/对话框/模式的微调器日期选择器? 我在整个网络上进行了谷歌搜索,但没有找到与之相关的任何合适
我不知道该怎么做,我一直遇到问题。 以下是代码: rows = int(input()) for i in range(1,rows): for j in range(1,i+1):
我想为重写创建一个正则表达式。 将所有请求重写为 index.php(不需要匹配),它不是以/api 开头,或者不是以('.html',或'.js'或'.css'或'.png'结束) 我的例子还是这样
MVC模式代表 Model-View-Controller(模型-视图-控制器) 模式 MVC模式用于应用程序的分层开发 Model(模型) - 模型代表一个存取数据的对象或 JAVA PO
我想为组织模式创建一个 RDF 模式世界。您可能知道,组织模式文档基于层次结构大纲,其中标题是主要的分组实体。 * March auxiliary :PROPERTIES: :HLEVEL: 1 :E
我正在编写一个可以从文件中读取 JSON 数据的软件。该文件包含“person”——一个值为对象数组的对象。我打算使用 JSON 模式验证库来验证内容,而不是自己编写代码。符合代表以下数据的 JSON
假设我有 4 张 table 人 公司 团体 和 账单 现在bills/persons和bills/companys和bills/groups之间是多对多的关系。 我看到了 4 种可能的 sql 模式
假设您有这样的文档: doc1: id:1 text: ... references: Journal1, 2013, pag 123 references: Journal2, 2014,
我有这个架构。它检查评论,目前工作正常。 var schema = { id: '', type: 'object', additionalProperties: false, pro
这可能很简单,但有人可以解释为什么以下模式匹配不明智吗?它说其他规则,例如1, 0, _ 永远不会匹配。 let matchTest(n : int) = let ran = new Rand
我有以下选择序列作为 XML 模式的一部分。理想情况下,我想要一个序列: 来自 my:namespace 的元素必须严格解析。 来自任何其他命名空间的元素,不包括 ##targetNamespace和
我希望编写一个 json 模式来涵盖这个(简化的)示例 { "errorMessage": "", "nbRunningQueries": 0, "isError": Fals
首先,我是 f# 的新手,所以也许答案很明显,但我没有看到。所以我有一些带有 id 和值的元组。我知道我正在寻找的 id,我想从我传入的三个元组中选择正确的元组。我打算用两个 match 语句来做到这
我是一名优秀的程序员,十分优秀!