当我这样做(在我班上)
public:
Entity()
{
re_sprite_eyes = new sf::Sprite();
re_sprite_hair = new sf::Sprite();
re_sprite_body = new sf::Sprite();
}
private:
sf::Sprite* re_sprite_hair;
sf::Sprite* re_sprite_body;
sf::Sprite* re_sprite_eyes;
Run Code Online (Sandbox Code Playgroud)
一切正常.但是,如果我将声明更改为:
private:
sf::Sprite* re_sprite_hair, re_sprite_body, re_sprite_eyes;
Run Code Online (Sandbox Code Playgroud)
我得到这个编译器错误:
error: no match for 'operator=' in '((Entity*)this)->Entity::re_sprite_eyes = (operator new(272u), (<statement>, ((sf::Sprite*)<anonymous>)))
Run Code Online (Sandbox Code Playgroud)
然后它说候选人re_sprite_eyes是sf::Sprite对象和/或参考.
为什么这不起作用?声明不一样吗?
Kar*_*k T 49
sf::Sprite* re_sprite_hair, re_sprite_body, re_sprite_eyes;
不声明3个指针 - 它是一个指针和2个对象.
sf::Sprite*遗憾的是,它不适用于在它后面声明的所有变量,只是第一个.它相当于
sf::Sprite* re_sprite_hair;
sf::Sprite re_sprite_body;
sf::Sprite re_sprite_eyes;
Run Code Online (Sandbox Code Playgroud)
你想做:
sf::Sprite *re_sprite_hair, *re_sprite_body, *re_sprite_eyes;
你需要为每个变量放一颗星.在这种情况下,我更喜欢将恒星放在变量的一边,而不是类型,以使这种情况明确.
Joh*_*ode 14
在C和C++中,*绑定到声明符,而不是类型说明符.在这两种语言中,声明都基于表达式的类型,而不是对象.
例如,假设您有一个指向intnamed 的指针p,并且您想要访问指向的 int值p; 你通过使用一元运算*符取消引用指针来实现这一点,如下所示:
x = *p;
Run Code Online (Sandbox Code Playgroud)
表达式 的类型*p是int; 因此,宣言p是
int *p;
Run Code Online (Sandbox Code Playgroud)
无论你在同一个声明语句中声明多少指针,都是如此; 如果q并且r还需要声明为指针,那么它们还需要将一元*作为声明符的一部分:
int *p, *q, *r;
Run Code Online (Sandbox Code Playgroud)
因为表达式 *q和*r类型int.这是C和C++语法的事故,你可以写T *p,T* p或T * p; 所有这些声明都将被解释为T (*p).
这就是为什么我不喜欢将指针和引用类型声明为C++的风格
T* p;
T& r;
Run Code Online (Sandbox Code Playgroud)
因为它暗示了对C和C++声明语法如何工作的错误观点,导致您刚刚遇到的确切混淆.但是,我已经编写了足够的C++来实现有时候这种风格确实使代码的意图更加清晰,特别是在定义容器类型时.
但它仍然是错的.
在C++ 11中,你有一个很好的小解决方法,这可能比来回移动空间更好:
template<typename T> using type=T;
template<typename T> using func=T*;
// I don't like this style, but type<int*> i, j; works ok
type<int*> i = new int{3},
j = new int{4};
// But this one, imho, is much more readable than int(*f)(int, int) = ...
func<int(int, int)> f = [](int x, int y){return x + y;},
g = [](int x, int y){return x - y;};
Run Code Online (Sandbox Code Playgroud)