2011-09-29 119 views
0

假设您有一个带有指向数组的私有指针的类。如何使用getter访问(或有效地复制数据),以便可以在不同的变量中访问它。返回指向数组的指针

class MyClass 
{ 
    private: 
     double *x; 
    public: 
     myClass(); 
     virtual ~MyClass(); 
     double* getX() const; 
     void setX(double* input); 
}; 

MyClass::MyClass() 
{ 
    double foo[2]; 
    double * xInput; 
    foo[0] = 1; 
    foo[1] = 2; 

    xInput = foo; 
    setX(xInput); 
} 

void MyClass::setX(double * input) 
{ 
    x = input; 
} 

double * MyClass::getX() const; 
{ 
    return x; 
} 

int main() 
{ 
    MyClass spam(); // Construct object 
    double * bar = spam.getX(); // This doesn't work 
} 

在这种情况下,棒[0]和酒吧[1]等于jibberish:-9.2559631349317831e+061

+0

我很惊讶我在SE上找不到类似的问题,但如果有人证明我错了,请关闭答案ahoy! – Elpezmuerto

+2

如果您告诉我们您遇到的错误,这将有所帮助。 –

+0

很高兴提供确切的编译器输出,而不是“这不行”。 – unwind

回答

3

只是猜测,程序崩溃或显示错误的输出。这是因为构造函数正在设置一个指向局部数组的指针,这会在构造函数结束时离开作用域并被销毁。

+0

那么我该如何解决在构造函数中? – Elpezmuerto

+0

@Elpezmuerto:MyClass需要一个'double foo [2]'成员,否则你将不得不使用动态内存。 (对于动态内存,请在C++书籍中阅读更多内容) –

+0

@Elpezmuerto,您需要使用不会消失的数组初始化指针。它可以是类的成员,静态变量,传递给构造函数的参数,或者用new分配的东西。如果你分配它,但你必须在某个时候删除它,这需要知道你是否拥有指针,或者它是否通过setX提供。 –

7
MyClass spam(); // Construct object 

这并不构造一个对象,即声明了一个名为spam函数,它没有参数,并返回一个MyClass。此默认构造一个对象:

MyClass spam; // Construct object 

欲了解更多信息,谷歌最伤脑筋的解析

更新:正如@Mark Ransom所指出的那样,您的代码存在另一个问题。在你的构造函数中创建一个数组,然后设置x指向这样的数组。但是,一旦构造函数完成执行,数组的生命周期结束,所以进一步访问x会崩溃(如果你够幸运的话)。

+1

这个家伙说什么! :) – MGZero

+1

+1有趣的一点信息! –

+2

而令人烦恼的原因是很难发现 - 我当然错过了。 +1 –

0

这应该是* bar而不是bar [0]。

+3

在C和C++中,它们是等价的。 –

+0

是的,你是对的,当然是:-) – Dabbler