在一行上声明多个对象指针会导致编译器错误

21 c++ oop sfml

当我这样做(在我班上)

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_eyessf::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,并且您想要访问指向的 intp; 你通过使用一元运算*符取消引用指针来实现这一点,如下所示:

x = *p;
Run Code Online (Sandbox Code Playgroud)

表达式 的类型*pint; 因此,宣言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* pT * p; 所有这些声明都将被解释为T (*p).

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

T* p;
T& r;
Run Code Online (Sandbox Code Playgroud)

因为它暗示了对C和C++声明语法如何工作的错误观点,导致您刚刚遇到的确切混淆.但是,我已经编写了足够的C++来实现有时候这种风格确实使代码的意图更加清晰,特别是在定义容器类型时.

但它仍然是错的.

  • 使用 &amp; 来指示引用是一种 C++ 构造,与原始 C 声明不太相符。过去,我对引用进入 C++ 的方式持保留态度,部分原因是这样。地址运算符以一种令人困惑的方式重载 - 不像 &lt;&lt; 和 &gt;&gt; 那样严重。:-) (2认同)

ric*_*ici 5

在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)