在一行上定义多个对象指针导致编译器错误(Declaring multiple object poin

2019-07-04 05:41发布

当我这样做(在我的班级)

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;

一切工作正常。 但是,如果我改变了声明如下:

private:
    sf::Sprite* re_sprite_hair, re_sprite_body, re_sprite_eyes;

我得到这个编译器错误:

error: no match for 'operator=' in '((Entity*)this)->Entity::re_sprite_eyes = (operator new(272u), (<statement>, ((sf::Sprite*)<anonymous>)))

然后它说对考生re_sprite_eyessf::Sprite对象和/或引用。

为什么这个不行? 未在声明的一样吗?

Answer 1:

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;

你想做的事:

sf::Sprite *re_sprite_hair, *re_sprite_body, *re_sprite_eyes;

你需要把一个明星为每个变量。 在这种情况下,我宁愿保持对变量的身边的明星,而不是类型,使正是这种情况清楚。



Answer 2:

在C和C ++中, *结合到声明符 ,而不是类型说明符。 在这两种语言,声明是基于类型的表达式 ,而不是对象。

例如,假设你有一个指向int命名为p ,你要访问的intp点; 您通过取消引用指针与一元这么做*运算符,就像这样:

x = *p;

类型表达*pint ; 因此,声明p

int *p;

这是真实的,不管你同一个声明语句中有多少指针声明; 如果qr也需要被声明为指针,那么他们还需要有一元*作为说明符的一部分:

int *p, *q, *r;

因为表达式 *q*r有型int 。 这是C和C ++语法的事故,你可以写T *pT* p ,或者T * p ; 所有这些声明的将被解释为T (*p)

这就是为什么我不喜欢声明指针和引用类型为一体的C ++风格

T* p;
T& r;

因为它意味着的C和C ++声明语法是如何工作的,从而导致确切的困惑,你刚刚经历了一个不正确的观点。 不过,我已经写了足够的C ++实现,有当这种风格确实让的代码更清晰的意图时,定义容器类型时尤其如此。

但它仍然是错误的。



Answer 3:

在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;};


Answer 4:

可以请你注意的另一件事是行:

 int * p1, * p2; 

这声明在前面的例子中所用的两个指针。 但是请注意,有星号( *为每个指针),以便既具有类型int* (指针为int)。 这是由于优先规则要求。 需要注意的是如果,相反,代码为:

 int * p1, p2; 

p1确实是类型的int* ,但p2是类型int 。 不计空格都用于这一目的。 但无论如何,简单地记住放一个星号每个指针是足以满足大多数用户的指针感兴趣的宣布每条语句多个指针。 甚至更好:使用不同的statemet每个变量。

从http://www.cplusplus.com/doc/tutorial/pointers/



Answer 5:

星号结合到指针的变量名。 记住这一点的方法是注意到,在C / C ++,声明模仿使用。

指针可以使用这样的:

sf::Sprite *re_sprite_body;
// ...
sf::Sprite sprite_bod = *re_sprite_body;

同样的,

char *foo[3];
// ...
char fooch = *foo[1];

在这两种情况下,有一个潜在的类型说明符,并且操作员或运营商需要为“到达”该类型中的表达的目的。



文章来源: Declaring multiple object pointers on one line causes compiler error
标签: c++ oop sfml