我有一个带有两个构造函数的类,一个不带参数,另一个带一个参数.
使用带有一个参数的构造函数创建对象可以按预期工作.但是,如果我使用不带参数的构造函数创建对象,我会收到错误.
例如,如果我编译此代码(使用g ++ 4.0.1)...
class Foo
{
public:
Foo() {};
Foo(int a) {};
void bar() {};
};
int main()
{
// this works...
Foo foo1(1);
foo1.bar();
// this does not...
Foo foo2();
foo2.bar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...我收到以下错误:
nonclass.cpp: In function ‘int main(int, const char**)’:
nonclass.cpp:17: error: request for member ‘bar’ in ‘foo2’, which is of non-class type ‘Foo ()()’
Run Code Online (Sandbox Code Playgroud)
为什么这样,我如何使它工作?
假设您正在为Mac OS X创建游戏.事实上,假设您正在创建Quake,只有2011年,您更愿意只使用现代的,不推荐使用的框架.
当用户按下(或释放)键盘上的任何键时,您希望通知您的游戏.这包括修改键,如移位和控制.编辑添加:此外,您想知道是否按下了修改键的左侧或右侧版本.
您还希望您的游戏具有配置屏幕,用户可以在其中检查和修改键盘配置.它应包含以下内容:
你是做什么?我一直试图找到一个好的答案,但现在已经有一天了,但还没有成功.
这就是我想出的:
那么,这样做的正确方法是什么?这真的感觉就像一个应该有一个众所周知的,记录良好的解决方案的问题.这不像游戏是非常小众的.
假设我有一个(普通的)类,它是可移动构造和可移动分配但不可复制构造或可复制分配:
class movable
{
public:
explicit movable(int) {}
movable(movable&&) {}
movable& operator=(movable&&) { return *this; }
movable(const movable&) = delete;
movable& operator=(const movable&) = delete;
};
Run Code Online (Sandbox Code Playgroud)
这很好用:
movable m1(movable(17));
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用,因为m1它不是右值:
movable m2(m1);
Run Code Online (Sandbox Code Playgroud)
但是,我可以包m1中std::move,它投射到一个右值引用,以使其工作:
movable m2(std::move(m1));
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在,假设我有一个(同样微不足道的)容器类,它包含一个值:
template <typename T>
class container
{
public:
explicit container(T&& value) : value_(value) {}
private:
T value_;
};
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用:
container<movable> c(movable(17));
Run Code Online (Sandbox Code Playgroud)
编译器(我试过clang 4.0和g ++ 4.7.2)抱怨我正在尝试movable在container初始化列表中使用已删除的复制构造函数.同样,包裹value在std::move使得它的工作:
explicit container(T&& value) : value_(std::move(value)) {} …Run Code Online (Sandbox Code Playgroud) 我正在寻找适用于 Mac OS X 的光栅图形框架。具体来说,我想要某种可以像像素矩阵一样操作(至少在概念上)的视图。我的程序将以编程方式生成像素数据。
QuickDraw 非常适合该描述,但已被弃用。据我所知,Core Graphics 中没有类似的东西。我错过了什么吗?
一个普通的 C 框架比 Objective-C 框架更好,但我并不太挑剔。