类的实例只允许1个方法或程序崩溃

时间:2015-10-28 18:07:19

标签: c++ oop

我正在学习课程和OOP,所以当我遇到编程时遇到的最奇怪的错误时,我正在做一些练习程序。

所以,我有以下文件,从我的班级" pessoa"开始,位于pessoa.h:

#pragma once
#include <string>
#include <iostream>

using namespace std;

class pessoa {
public:
//constructor (nome do aluno, data de nascimento)
pessoa(string newname="asffaf", unsigned int newdate=1996): name(newname), DataN(newdate){};
void SetName(string a); //set name
void SetBornDate(unsigned int ); //nascimento
string GetName(); //get name
unsigned int GetBornDate();
virtual void Print(){}; // print

private:
string name; //nome
unsigned int DataN; //data de nascimento
};

在pessoa.cpp中定义了哪些函数

#include "pessoa.h"

string pessoa::GetName ()
{
    return name;
}

void pessoa::SetName(string a)
{
    name = a;
}

unsigned int pessoa::GetBornDate()
{
    return DataN;
}

void pessoa::SetBornDate(unsigned int n)
{
    DataN=n;
}

在DoArray.h中声明并在文件DoArray.cpp中定义的函数DoArray:

    pessoa** DoArray(int n)
{
    pessoa* p= new pessoa[n];
    pessoa** pointer= &p;
    return pointer;
}

主文件:

#include <string>
#include <iostream>
#include "pessoa.h"
#include "DoArray.h"
#include <cstdio>

using namespace std;

int main()
{
//pessoa P[10];
//cout << P[5].GetBornDate();
pessoa** a=DoArray(5);
cerr << endl << a[0][3].GetBornDate() << endl;
cerr << endl << a[0][3].GetName() << endl;


    return 0;
}

奇怪的发现是,如果我评论上述方法之一,&#34; GetBornDate&#34;或GetName,并运行,未评论的方法将正常运行和假设。但是,如果两者都没有被注释,那么第一个将运行,程序将在第二个方法之前崩溃。

很抱歉这篇长篇文章。

1 个答案:

答案 0 :(得分:5)

让我们看一下这个函数:

int *get()
{
    int i = 0;
    return &i;
}

它有什么问题?它返回指向局部变量的指针,当函数get()终止时它不再存在,即它返回悬空指针。现在你的代码:

 pessoa** DoArray(int n)
 {
     pessoa* p= new pessoa[n];
     return &p;
 }
你看到了问题吗?

进一步澄清:

 typedef pessoa * pessoa_ptr;
 pessoa_ptr* DoArray(int n)
 {
     pessoa_ptr p= whatever;
     return &p;
 }

您需要了解分配给p的任何内容都不会改变p本身的生命周期。指针与其他指针的变量相同。