小编Emi*_*ier的帖子

我可以通过UIAppearance代理设置哪些属性?

我可以通过UIAppearance代理设置哪些属性?Apple的UIKit文档没有列出它们.有这些属性的列表吗?

iphone uikit ios ios5 ios6

75
推荐指数
1
解决办法
2万
查看次数

是否可以从STL容器继承实现,而不是委托?

我有一个类,它适应std :: vector来模拟特定于域的对象的容器.我想向用户公开大多数std :: vector API,以便他/她可以在容器上使用熟悉的方法(大小,清晰,等等......)和标准算法.在我的设计中,这似乎是一种反复出现的模式:

class MyContainer : public std::vector<MyObject>
{
public:
   // Redeclare all container traits: value_type, iterator, etc...

   // Domain-specific constructors
   // (more useful to the user than std::vector ones...)

   // Add a few domain-specific helper methods...

   // Perhaps modify or hide a few methods (domain-related)
};
Run Code Online (Sandbox Code Playgroud)

我知道在重用类实现时更喜欢使用组合继承的做法 - 但是必须有限制!如果我将所有内容委托给std :: vector,那么(按我的计数)将有32个转发函数!

所以我的问题是......在这种情况下继承实施真的很糟糕吗?有什么风险?有没有更安全的方式我可以在没有这么多打字的情况下实现这一点?我是使用实现继承的异教徒吗?:)

编辑:

如何明确用户不应该通过std :: vector <>指针使用MyContainer:

// non_api_header_file.h
namespace detail
{
   typedef std::vector<MyObject> MyObjectBase;
}

// api_header_file.h
class MyContainer : public detail::MyObjectBase
{
   // ... …
Run Code Online (Sandbox Code Playgroud)

c++ stl

73
推荐指数
5
解决办法
3万
查看次数

NSArray对ARC下的对象的弱引用(__unsafe_unretained)

我需要在NSArray中存储对象的弱引用,以防止保留周期.我不确定使用正确的语法.这是正确的方法吗?

Foo* foo1 = [[Foo alloc] init];
Foo* foo2 = [[Foo alloc] init];

__unsafe_unretained Foo* weakFoo1 = foo1;
__unsafe_unretained Foo* weakFoo2 = foo2;

NSArray* someArray = [NSArray arrayWithObjects:weakFoo1, weakFoo2, nil];
Run Code Online (Sandbox Code Playgroud)

请注意,我需要支持iOS 4.x,__unsafe_unretained而不是__weak.


编辑(2015-02-18):

对于那些想要使用真__weak指针(不是__unsafe_unretained)的人,请查看这个问题:在ARC下归零弱引用

objective-c ios4 ios5 automatic-ref-counting

68
推荐指数
5
解决办法
4万
查看次数

使用C++ 11中显式删除的成员函数,是否仍然值得从不可复制的基类继承?

使用C++ 11中显式删除的成员函数,是否仍然值得从不可复制的基类继承?

我在谈论私有继承基类的技巧,该基类具有私有或删除的复制构造函数和复制赋值(例如boost::noncopyable).

这个问题提出的优势是否仍适用于C++ 11?


我不明白为什么有些人声称在C++ 11中使类不可复制更容易.

在C++ 03中:

private:
    MyClass(const MyClass&) {}
    MyClass& operator=(const MyClass&) {}
Run Code Online (Sandbox Code Playgroud)

在C++ 11中:

MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
Run Code Online (Sandbox Code Playgroud)

编辑:

正如许多人所指出的那样,为私有拷贝构造函数和拷贝赋值运算符提供空体(即{})是错误的,因为这将允许类本身调用那些运算符而没有任何错误.我首先开始没有添加{},但遇到了一些链接器问题,这些问题让我添加{}有些愚蠢的原因(我不记得这些情况).我知道更清楚.:-)

c++ noncopyable c++11

58
推荐指数
4
解决办法
3万
查看次数

你对typedef'ing shared_ptr的约定是什么?

我在typedef的boost :: shared_ptr模板的命名约定之间翻转.例如:

typedef boost::shared_ptr<Foo> FooPtr;
Run Code Online (Sandbox Code Playgroud)

在制定一项公约之前,我想看看其他人使用什么.你的约定是什么?

编辑:

对于那些在Foo中嵌入typedef的人来说,Foo现在"意识到"它将如何被传递并不会让你烦恼吗?它似乎打破了封装.这个怎么样:

class Foo
{
public:
    typedef std::vector<Foo> Vector
};
Run Code Online (Sandbox Code Playgroud)

你现在不会这样做,对吗?:-)

c++ boost naming-conventions shared-ptr

46
推荐指数
4
解决办法
2万
查看次数

在C++中优化空间而不是速度

当你说"优化"时,人们倾向于认为"速度".但是速度并不是那么关键的嵌入式系统呢,但内存是一个主要的限制因素呢?什么是一些指南,技术和技巧可用于削减ROM和RAM中的额外千字节?一个"配置文件"代码如何查看内存膨胀的位置?

PS One可能会争辩说,在嵌入式系统中"过早地"优化空间并不是那么邪恶,因为你给自己留下了更多的数据存储空间和功能蠕变.它还允许您降低硬件生产成本,因为您的代码可以在较小的ROM/RAM上运行.

PPS也欢迎参考文章和书籍!

PPPS这些问题密切相关:404615,1561629

c++ embedded optimization

42
推荐指数
6
解决办法
5271
查看次数

对于作用域枚举,相当于"使用名称空间X"?

我正在使用一个范围枚举来枚举我正在实现的某个状态机中的状态.例如,让我们说:

enum class CatState
{
    sleeping,
    napping,
    resting
};
Run Code Online (Sandbox Code Playgroud)

在我定义状态转换表的cpp文件中,我想使用等价的东西,using namespace X这样我就不需要为我的所有州名添加前缀CatState::.换句话说,我想用sleeping而不是CatState::sleeping.我的转换表有很多列,因此避免使用CatState::前缀会使事情变得更紧凑和可读.

那么,有没有办法避免一直打字CatState::


是的,是的,我已经意识到了陷阱using namespace.如果有强类型枚举的等价物,我保证只在我的cpp实现文件中的有限范围内使用它,而不是邪恶.

c++ enums c++11

36
推荐指数
3
解决办法
5150
查看次数

如何在C++中使用成员变量作为默认参数?

我想为其中一个成员函数选择一个参数.如果没有提供参数,它将使用成员变量.

但是,当我尝试编译它时,它显示" 错误:无效使用非静态数据成员'Object :: initPos' "

只是为了隔离问题,我尝试默认一个int类型,它编译得很好.我想知道我的代码有什么问题,以及如何使用成员函数作为默认值.

谢谢您的帮助!

Object.h

class Object
{
    public:
       ...
       void MoveTo(double speed, Point position);

    protected:
       Point initPos; 
       Point currPos;

};
Run Code Online (Sandbox Code Playgroud)

Object.c

void Object::MoveTo(double speed, Point position = initPos)
{
    currPos = postion;
}
Run Code Online (Sandbox Code Playgroud)

Point.h

class Point
{
    ...

    private:
       double x;
       double y;
       double z; 
};
Run Code Online (Sandbox Code Playgroud)

c++ arguments default object

33
推荐指数
3
解决办法
2万
查看次数

C++编译器是否通过const引用POD参数优化传递?

考虑以下:

struct Point {double x; double y;};

double complexComputation(const& Point p1, const Point& p2)
{
    // p1 and p2 used frequently in computations
}
Run Code Online (Sandbox Code Playgroud)

编译器是否将pass-by-reference优化为pass-by-copy以防止频繁解除引用?换句话说转换complexComputation成这个:

double complexComputation(const& Point p1, const Point& p2)
{
    double x1 = p1.x; double x2 = p2.x;
    double y1 = p1.y; double y2 = p2.y;
    // x1, x2, y1, y2 stored in registers and used frequently in computations
}
Run Code Online (Sandbox Code Playgroud)

由于Point是一个POD,通过在调用者的背后制作副本可以没有副作用,对吗?

如果是这种情况,那么我总是可以通过const引用传递POD对象,无论多小,都不必担心最佳传递语义.对?

编辑:我特别感兴趣的是GCC编译器.我想我可能要编写一些测试代码并查看ASM.

c++ optimization

28
推荐指数
2
解决办法
4678
查看次数

我什么时候应该关注std :: iostream :: sentry?

在线参考文献对目的有相当简短和模糊的描述std::iostream::sentry.我应该什么时候关注这个小动物呢?如果它只是用于内部使用,为什么要公开?

c++ iostream

27
推荐指数
2
解决办法
3719
查看次数