假设我有这样的类(简化):
class Foo_p;
class Foo
{
private:
Foo_p *p;
public:
Foo();
/* methods, etc... */
};
Run Code Online (Sandbox Code Playgroud)
该类是API的一部分.Foo_p是类的所有私有部分,它们不像往常一样在类Foo本身中声明,而是在一个单独的前向声明的类中,该类仅由外部不可见的底层实现使用.
我看过这个模式在几个项目中使用过,有没有名字呢?
另外,如何正确使用它(例如异常安全等)?实际实施应该在哪里?在Foo类中,像往常一样,只使用Foo_p存储数据,或者在Foo_p类中使用Foo只是一个包装器?
我以为我会通过改进一些非常简单的结构和算法来深入研究Rust,我开始使用链表.原来并不是那么简单.到目前为止这是我的代码:
enum List<T>
{
Node(T, ~List<T>),
Nil
}
impl<T> List<T>
{
fn new(vector: &[T]) -> List<T> { Nil }
fn add(&mut self, item: T)
{
let tail = self;
loop
{
match *tail
{
Node(_, ~ref next) => tail = next,
Nil => break
}
}
*tail = Node(item, ~Nil);
}
}
Run Code Online (Sandbox Code Playgroud)
这将无法编译,因为由于不兼容的可变性,下一个不能在match语句中分配给tail.我知道这可以很容易地使用垃圾收集指针来完成,但这种做法违背了练习的教育目的:我想知道如何在没有Gc或Rc指针的情况下做到这一点.
我有一个表示数据流的类,它基本上读取或写入文件,但首先是数据被加密/解密,还有一个底层编解码器对象来处理被访问的媒体.
我正在尝试以RAII的方式编写这个类,我想要一个干净,漂亮,可用的设计.
困扰我的是,现在构造函数中正在做很多工作.在可以安全地使用对象的I/O例程之前,首先需要初始化编解码器(这不是非常苛刻),但是然后考虑密钥并且加密和其他事情被初始化 - 这些需要一些分析需要大量计算的媒体.
现在我在构造函数中执行所有这些操作,这需要很长时间.我正在考虑将加密初始化的东西(大多数工作)从ctor转移到一个单独的方法(比方说Stream::auth(key)
),但话又说回来,这将把一些责任转移给类的用户,因为他们需要auth()
在他们调用任何I/O操作之前运行.这也意味着我必须检查I/O调用以验证是否auth()
已被调用.
你认为什么是好的设计?
PS我确实读过类似的问题,但我真的无法在这个案例中应用答案.他们大多喜欢"它取决于......": - /
谢谢
此代码无法复制:
namespace boost
{
template<class T> class scoped_ptr;
}
namespace FooNamespace
{
class FooClass
{
boost::scoped_ptr<FooType> foo;
};
}
Run Code Online (Sandbox Code Playgroud)
g ++说:错误:字段'foo'的类型不完整
我认为没关系,因为我从实际的boost头文件中复制了scoped_ptr声明...我搞砸了什么?
注意:问题不在于error: field ‘foo’ has incomplete type
.我试着替换它FooType
无济于事......
谢谢!
好吧,我在CMake中有一个项目结构如下:
CMakeLists.txt
/libfoo/CMakeLists.txt
/frontend/qt/CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
libfoo
是一个我正在写的图书馆,frontend/qt
是一个小前端,也是一个使用的例子.问题是CMake将相对路径传递libfoo.so.x
给链接器而不是-l
选项.Qt gui目标声明如下:
add_executable(qtgui ${qtgui_sources} ${qtgui_moced} ${qtgui_ui_h})
target_link_libraries(qtgui ${QT_LIBRARIES} foo)
Run Code Online (Sandbox Code Playgroud)
我宁愿它只是链接-lfoo
像所有其他库,而不是完整的路径.怎么做?
谢谢!
我正在为我的lib编写一个C包装器API.
我通常像void*
在C中那样传递我的C++对象.并且每个对象的公共函数都有自然的访问包装函数.C代码不访问本机C++类成员.
昨天,有人在IRC上提到我不应该像C中那样传递指向C++模板类的指针,void*
因为它很危险.这是真的?从指针到模板类的指向普通C++类的指针有何不同?
谢谢!
我想从匿名函数中调用某个函数,如
@(){fooBar(baz)}
Run Code Online (Sandbox Code Playgroud)
麻烦的是,fooBar
没有输出,这使得匿名函数抱怨.除了使fooBar
函数返回虚拟输出之外,有没有办法解决这个问题?