Класс для проведения информацию человека


Я написал другую программу на C++. Кроме того, что определение класса должно находиться в отдельном заголовочном файле, есть все, что должно быть улучшено?

/*
    Date:5th January 2011
    Programmer:Fahad
*/
#include <iostream>
#include <string>
using namespace std;
class Persons     //A class that will store the name,addresses and id numbers of the users
{
    private:
        string name_;
        string address_;
        int id_number_;

    public:
        static int count;    //This is the count of the objects created
        Persons();
        void getData(int n);
        void displayData(int n);
        ~Persons();
};

int Persons count;//initializing the static member

int main()
{
    cout << "Enter Number Of Persons:";
    int n;     //This is the number of objects that the user wants to make.
    cin >> n;
    Persons *ptr;    //A pointer that will be used for the dynamic memory allocation.

    /*Exception Handling*/
    ////////////////////////////////////////////////////////////////////
    try
    {
        //ptr=new [sizeof(Persons) * n];
        ptr=new Persons[n];
    }
    catch(bad_alloc xa)
    {
        cout<<"Sorry,Program Can Not Continue";
        cin.get();
        exit(1);
    }
    /////////////////////////////////////////////////////////////////////
    for(int i = 0; i< n; i++)
    {
        ptr[i].getData(n);
    }
    for(int j = 0; j< n; j++)
    {
        ptr[j].displayData( n );
    }
    cin.get();
    delete[] ptr;
    return 0;
}


/*Function Definitions*/

Persons::Persons()
{
    name_="";
    address_="";
    id_number_=0;
    count++;
}
void Persons::getData(int n)
{

        cout<<"Enter Name (Press '$' To Exit):";
        getline(cin,name_,'$');
        cout<<endl<<"Enter Address (Press '$' To Exit):";
        getline(cin,address_,'$');
        cout<<endl<<"Enter Identitiy Card Number:";
        cin>>id_number_;

}
void Persons::displayData(int n)
{

        cout<<"Name:"<<name_;
        cout<<endl<<"Address:"<<address_;
        cout<<endl<<"Identitiy Card Number:"<<id_number_;

}


1241
12
задан 5 февраля 2011 в 10:02 Источник Поделиться
Комментарии
5 ответов

Я избежать с помощью пространства имен std;.


cout << "Enter Number Of Persons:";
int n; //This is the number of objects that the user wants to make.
cin >> n;

Лично я всегда использую Гэтлину , чтобы захватить линию, в то время, когда с помощью функции std::Кин для интерактивного ввода. Тот факт, что >> останавливается на пробел означает, что это очень легко для пользователя, чтобы ввести два поля в одной строке, а затем второе поле используется на более позднем этапе в программе пользователя возможность реагировать на более поздние строки.

Также вы всегда должны проверить, является ли операция ввода удалось.

std::string inputline;
if( std::getline( cin, inputline ) )
{
std::istringstream iss( inputline );
if( iss >> n )
{
// success
}
else
{
} // fail
}
else
{
// fail
}


catch(bad_alloc xa)
{
cout<<"Sorry,Program Can Not Continue";
cin.get();
exit(1);
}

За все, что вы на самом деле делать в обработчике исключений, вы можете также позволить ожиданием пропаганды. Среда выполнения может фактически дать более понятное сообщение об ошибке для bad_alloc. Также, если у вас есть уважительная причина, всегда ловить исключения по константной ссылке. например, поймать( константные СТД::bad_alloc& ба ).


Глядя на ваше определение лиц, я думаю, что человек - это лучшее имя для класса. Я вижу одно имя и один адрес, если класс представлен несколькими людьми (например, домохозяйства) вам потребуется по крайней мере несколько имен, я бы подумал.

Всегда попробовать и избежать необходимости использовать удалить[] в явном виде. Здесь вектор будет значительно проще и безопаснее.

std::vector<Person> persons(n);


int Persons count;//initializing the static member

Класса статические переменные, как правило, не рекомендуется. Это не действительным, он должен быть:

int Persons::count;

В этой программе он не дает вам ничего, что н не так, я бы просто удалить его.


Persons::Persons()
{
name_="";
address_="";
id_number_=0;
count++;
}

Всегда предпочитаю инициализировать переменные-члены. Назначение "" в недавно построенном СТД::строка является избыточной, так что вы могли бы сделать что-либо.

Persons::Persons()
: name_()
, address_()
, id_number(0)
{
count++;
}

или даже этот (хотя некоторые люди предпочитают явный инициализатор для всех членов и баз).

Persons::Persons()
: id_number(0)
{
count++;
}


for(int i = 0; i< n; i++)
{
ptr[i].getData(n);
}
for(int j = 0; j< n; j++)
{
ptr[j].displayData( n );
}

Почему метода GetData и displayData брать инт? Они не используют параметр, и я не понимаю, почему вы передаете Н.


cin.get();

Это кажется излишним.


void Persons::getData(int n)
{

cout<<"Enter Name (Press '$' To Exit):";
getline(cin,name_,'$');
cout<<endl<<"Enter Address (Press '$' To Exit):";
getline(cin,address_,'$');
cout<<endl<<"Enter Identitiy Card Number:";
cin>>id_number_;

}

Опять же, мои комментарии по поводу неиспользуемый параметр, всегда используя Гэтлином и всегда проверять успешность операций ввода применяются все.

18
ответ дан 5 февраля 2011 в 11:02 Источник Поделиться

Первые ошибки: статический атрибут член должен быть инициализирован как:

int Persons::count = 0;

Тогда в общем: вы должны использовать СТД::вектор , чтобы избежать необходимости вручную управлять ресурсами. В то время как они правильно управляли в этот небольшой пример кода, если вы начинаете строительство больших проектов, вы, скорее всего, ошиблись в какой-то день (все делают это). Программа обороне, чтобы избежать ошибок: использовать существующие библиотеки.

В метода GetData() и displayDAta() функции-члены не нуждаются в аргументации, ни они его используют. Удалить его из интерфейса.

Вы не обработка ошибок в метода GetData() функция-член, ни в главном. Вы должны проверить состояние объекта iStream после каждой операции.

Я стараюсь избегать с помощью пространства имен директивы, но это дело вкуса.

4
ответ дан 5 февраля 2011 в 11:02 Источник Поделиться

если вам нужно комментарий об использовании переменной, как:

static int count;    //This is the count of the objects created

вы должны использовать собственные описательные имена, как object_count вместо.

тоже касается

int n;     //This is the number of objects that the user wants to make.

что может электронная amount_of_objects руды что-то подобное

4
ответ дан 5 февраля 2011 в 12:02 Источник Поделиться


  • Человек имя довольно запутанным для представления одного человека

  • Похоже, основная идея заключается, чтобы сериализовать/десериализовать экземпляр человека (поправьте меня, если я ошибаюсь здесь). Более естественным является переопределить оператор >> и оператора << - это позволит вам определить каждого потока, в качестве данных источника/назначения не только стандарт/в.

    istream& operator>> (istream& in, Person& p)    
    {
    in >> p.Name
    in >> p.Address;
    return in;
    }

    ostream& operator<< (ostream& out, const Person& p)
    {
    out << p.Name << 't';
    out << p.Address << endl;
    return out;
    }


4
ответ дан 5 февраля 2011 в 12:02 Источник Поделиться

Это, вероятно, не будет дела, но этот класс не будет использоваться в многопоточном приложении? Если это так, вы должны быть замок вокруг увеличиваем счетчик , поскольку несколько потоков могут выделять объект этого типа одновременно. В общем, будьте осторожны, когда делаете подобные вещи, и спросите себя, если ваш класс действительно волнует, сколько раз его уже построены, или если вы должны быть, следить, за пределами самого класса.

3
ответ дан 5 февраля 2011 в 02:02 Источник Поделиться