Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2009, 14:20   #1
nikzntu
Пользователь
 
Регистрация: 13.01.2009
Сообщений: 10
По умолчанию Помогите с оптимизированием кода

Помогите с оптимизированием кода
Задача создать класс динамический класс book,в нем дин массив авторы (предусмотреть возможность ввода Фио автора кол-во книг и года рождения). И создать класс каталог (в условии не оговорено конкретно где). Ввод и вывод данных каталога должен происходить через дружественные функции
(логически массив автор и массив каталог как-то связывать друг с другом НЕ нужно) вот что накодил я ,но чувствую, что здесь можно избежать повторения одинаковых элементов
Код:
#include <stdlib.h>
#include <conio.h>
#include <iostream>
#include <math.h>
#include <string>
using namespace std;
class book
{
public:  book (int size);
friend void add_avtors(string val,book *obj, int index );
friend void add_avtors_show(book* obj, int index);
friend void add_book(string val1,book *obj2, int index );
friend void add_book_show(book* obj2, int index);
void createAuthors();
void input();
void output();
string add_author();
string del_author();
private:
int size;
int index;
int i, x, x2,x3, x4, x5;
  string *data, **Author,j;
};
book::book (int size)
{
   data=new string [size];
   if (data==NULL)
   {
      cerr<<"NO memory"<<endl;
      exit(1);
   }
  book::size=size;
  book::index=0;
}
void book::createAuthors(){
cout<<endl<<"Vvedite kol-vo avtorov : ";
cin>>x;
x=x-1;
x2=3;
Author= new string*[x];
for (int k=0; k<x2; k++)
Author[k]= new  string[x2];
}
string book::add_author(){
for (i=0; i<=x;i++)
{cout<<endl<< "Vvedite FIO  : ";
cin>>Author[i][0];
cout<<endl<< "Vvedite kol-vo knig  : ";
cin>>Author[i][1];
cout<<endl<< "Vvedite daty rozdenia  : ";
cin>>Author[i][2];
}
return(Author[1][1]);
}
string book::del_author(){
string author_for_del;
cout<<endl<<"Vvedite ima avtora dla udalenia  : ";
cin>>author_for_del;
for (i=0;i<x;i++)
{
	if(author_for_del==Author[i][0]){cout<<endl<<"del name right  : ";
cout<<endl<<author_for_del;
break;}}
cout<<endl<<" Noviy spisok : ";
for(i;i<x;i++){
Author[i][0]=Author[i+1][0];
Author[i][1]=Author[i+1][1];
Author[i][2]=Author[i+1][2];
}
for(i=0;i<x;i++)
cout<<endl<<" FIO :"<<Author[i][0]<<" Kol-Vo knig : "<<Author[i][1]<<" Year :"<<Author[i][2];
return (author_for_del);
}
void add_avtors(string value, book* obj, int index)
{   obj->data [index]=value;}
void add_avtors_show(book* obj, int index){
cout<<obj->data[index];}

void add_book(string value1, book* obj2, int index)
{   obj2->data [index]=value1;
}
void add_book_show(book* obj2, int index){   
cout<<obj2->data[index];
}
//-----------------------------------------------------------------
void main()
{book base(0);
base.createAuthors();
base.add_author();
base.del_author();
cout<<endl<<"Vvedite kol-vo elementov katalora : "<<endl;
  int size;
  cin>>size;
  book numbers(size);
    book numbers2(size);
  string i;
  for (int j=0; j<size;j++)
  {cout<<"Vvedite ima avtora (dla kataloga) : ";
      cin>>i;
      add_avtors(i, &numbers, j);
	  cout<<"Vvedite nazvanie book : ";
      cin>>i;
      add_book(i, &numbers2, j);
  } 
  for (int j=0;j<size;j++)
  {cout<<"Avtor :  ";
    add_avtors_show(&numbers, j );
    cout<<endl;
  cout<<"Nazvanie :  ";
    add_book_show(&numbers2, j );
    cout<<endl;
  }
  system("PAUSE");
  }
nikzntu вне форума Ответить с цитированием
Старый 25.03.2009, 14:35   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Оптимизировать тут нечего. Могу только сказать, что неправильно спроектированы классы. Класс book должен по логике отвечать только за хранение данных, но никак не за их ввод.
Далее метод string add_author(); возвращает объект класса string по значению, т.е. в строке return(Author[1][1]); вызывается конструктор копирования и создается новый объект. Логичнее возвращать ссылку на уже имеющуюся строку.
Так как уже используете STL, для хранения авторов не разумнее ли использовать vector и не заморачиваться с выделением памяти?
Далее вижу в конструкторе new, в createAuthors тоже происходит выделение памяти, а где деструктор, который все это удаляет?
В string book:el_author() сместили всех авторов и затерли указатель на удаляемого, но кто этого автора удалит из памяти? Не будет ли у нас в конце 2 одинаковых автора?
Вот на первый взгляд вроде бы и все
ЗЫ. Еще вот этому:
Код:
int i, x, x2,x3, x4, x5;
Нечего делать в классе. Эти переменные должны быть локальными в использующих их методах.
И еще приучайтесь использовать const как для параметров, так и для методов.

Последний раз редактировалось pu4koff; 25.03.2009 в 14:40.
pu4koff вне форума Ответить с цитированием
Старый 25.03.2009, 17:22   #3
nikzntu
Пользователь
 
Регистрация: 13.01.2009
Сообщений: 10
По умолчанию

[QUOTE=pu4koff;227557]Далее метод string add_author(); возвращает объект класса string по значению, т.е. в строке return(Author[1][1]); вызывается конструктор копирования и создается новый объект. Логичнее возвращать ссылку на уже имеющуюся строку.[QUOTE]
Вот это не совсем понял можно поподробнее?
nikzntu вне форума Ответить с цитированием
Старый 25.03.2009, 17:37   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от nikzntu Посмотреть сообщение
Вот это не совсем понял можно поподробнее?
Сейчас у вас возвращается новый объект.
вызов return(Author[1][1]) превращается в нечто такое:
Код:
string temp(Author[1][1]);
return temp;
Сделайте:
string& add_author() или string* add_author() как больше нравится.
Вообще не знаю, может вас и такое поведение устраивает, как сейчас
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите в написании кода... sobol556 Паскаль, Turbo Pascal, PascalABC.NET 0 23.03.2009 19:49
Помогите, пожалуйста, реализовать часть кода Horknee Паскаль, Turbo Pascal, PascalABC.NET 2 01.12.2008 23:30
помогите понять кусок кода Arteom БД в Delphi 7 31.08.2007 08:51
Выдернуть куски кода из html-кода trafbite Помощь студентам 7 18.08.2007 13:51