C++ 指向对象表的指针

C++ 指向对象表的指针,c++,class,oop,pointers,C++,Class,Oop,Pointers,我想在所有垃圾邮件方法中使用对象的foo数组。 当我创建一个对象时,这个方法(当然有一个*)对我有效。 但即使我使用Bar**foo或Bar**foo[2],Xcode也向我显示我创建了指向对象的新指针 [编辑]我注释了错误的代码示例,我的疏忽,谢谢各位 这里似乎有缓冲区溢出: Bar **foo = new Bar*[1]; // allocate one-element array of pointers to Bar foo[0] = new Foo(this); // v

我想在所有垃圾邮件方法中使用对象的foo数组。

当我创建一个对象时,这个方法(当然有一个*)对我有效。

但即使我使用Bar**foo或Bar**foo[2],Xcode也向我显示我创建了指向对象的新指针


[编辑]我注释了错误的代码示例,我的疏忽,谢谢各位

这里似乎有缓冲区溢出:

Bar **foo = new Bar*[1];   // allocate one-element array of pointers to Bar
foo[0] = new Foo(this);    // valid assignment
foo[1] = new Foo(this);    // off the end of the array.

这里似乎有缓冲区溢出:

Bar **foo = new Bar*[1];   // allocate one-element array of pointers to Bar
foo[0] = new Foo(this);    // valid assignment
foo[1] = new Foo(this);    // off the end of the array.

在您的
fun1
中,语句
Bar**foo=newbar*[1]
定义一个新的局部变量
foo
,该变量隐藏类成员名称


如果您想改为引用类成员,请说
foo=newbar*[1]

在您的
fun1
中,语句
Bar**foo=newbar*[1]
定义一个新的局部变量
foo
,该变量隐藏类成员名称

如果您想改为引用类成员,请说
foo=newbar*[1]

在方法Spam::fun1()中,您将内存分配给类型为“Bar**”的局部变量“foo”。相反,您必须为类成员变量“foo”分配内存。你可以做两件事来解决这个问题

  • 删除局部变量声明“foo”,使用下面的代码,而不是“Bar**foo=new Bar*[1];“inside”Spam::fun1()

    foo=新条*[1]

  • 如果出于某些原因希望保留局部变量,请使用“this”指针指示类成员

    此->foo=新条*[1]

  • 只是一个建议,如果您在源代码中遵循如下正确的命名约定,您可以避免此类混淆

    class CSpam: public CLayer
    {
    private:
    Bar ** mFoo;
    };
    
    void Spam::fun1()
    {
      mFoo = new Bar*[1]; 
    }
    
    在方法Spam::fun1()中,您将内存分配给类型为“Bar**”的局部变量“foo”。相反,您必须为类成员变量“foo”分配内存。你可以做两件事来解决这个问题

  • 删除局部变量声明“foo”,使用下面的代码,而不是“Bar**foo=new Bar*[1];“inside”Spam::fun1()

    foo=新条*[1]

  • 如果出于某些原因希望保留局部变量,请使用“this”指针指示类成员

    此->foo=新条*[1]

  • 只是一个建议,如果您在源代码中遵循如下正确的命名约定,您可以避免此类混淆

    class CSpam: public CLayer
    {
    private:
    Bar ** mFoo;
    };
    
    void Spam::fun1()
    {
      mFoo = new Bar*[1]; 
    }
    

    您没有以健康的方式使用“正确工作”。显然
    foo[1]
    是一种越界访问。示例中任何包含
    foo[1]
    且“正常工作”的语句似乎只起作用。它可能会在任何时候无故停止工作。这是因为foo只包含1个元素(因为“new Bar*[1]”),这意味着只有索引0是合法访问的(对于大小为N的数组,您可以访问索引0到N-1)。有关未定义行为的更多信息,请参阅。好吧,我同意,这是我的错。即使是foo[0],在Spam::fun1()中工作,也很糟糕。但我正在寻找正确的方法来指出这一点,并在Spam::fun2()中使用相同的对象,这是我的问题。您没有以健康的方式使用“正确工作”。显然
    foo[1]
    是一种越界访问。示例中任何包含
    foo[1]
    且“正常工作”的语句似乎只起作用。它可能会在任何时候无故停止工作。这是因为foo只包含1个元素(因为“new Bar*[1]”),这意味着只有索引0是合法访问的(对于大小为N的数组,您可以访问索引0到N-1)。请参阅更多关于未定义行为的信息。OKI,我同意,这是我的错,甚至是FoO(0),在垃圾邮件::FUN1()中,但是我寻找正确的方法来指向这个点,并在垃圾邮件中使用相同的对象::Fun2-(),这是我的问题。[谷歌C++风格指南] [C++ ]编程风格指南]〔3〕[ GCC C++编码约定]〔1〕〔1〕:[ 2 ]:[ 3 ]:[谷歌C++风格指南]〔2〕[ C++编程风格指南]〔3〕[ GCC C++编码约定]〔1〕〔1〕:[ 2 ]:[ 3 ]: