IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Проблемы с ООП в С++., Microsoft Visual C++ .Net
Bo2nik
сообщение 23.04.2008 19:22
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: Никита

Репутация: -  0  +


 

#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <conio>

class Tags
{
protected:
	char nik[10];
	int tel;
public:
	Tags(char*,int);
	void virtual show();
	
            // здесь надо написать еще один метод для создания объектов класса Tags и размещения их в массиве 
	
            int getphone()
	{
		return tel;
	}
};

class XTags:public Tags
{
	int telr;
	public:
	XTags(char*,int,int);
	void show();
	// тут тоже нужен, вроде, метод
	int getphone()
            {
                       return tel;
            }
};

Tags::Tags(char* nnik,int ntel)
{
	strcpy(nik,nnik);
	tel=ntel;
}

XTags::XTags(char* nnik,int ntel,int ntelr):Tags(nnik,ntel)
{
	telr=ntelr;
}

void Tags::show()
{
	cout<<nik<<" "<<tel<<" ";
}

void XTags::show()
{
	Tags::show();
	cout<<telr;
}


void main()
{
	
}




Используются классы Tags(кличка животного и номер владельца) и XTags(Tags + телефон отдела регистрации). Используются три метода - show(это вывод информации на экран содержащейся в массиве), getphone(средство нахождения номера телефона владельца по кличке животного) и еще один метод которого у меня нет - создание объектов класса Tags и размещения их в массиве. Последнее как раз мне и нужно.

Сообщение отредактировано: Bo2nik - 23.04.2008 19:24
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 5)
volvo
сообщение 23.04.2008 19:30
Сообщение #2


Гость






Цитата
создание объектов класса Tags
вообще-то задача конструктора. Не совсем понятно, что именно тебе нужно, потому что на тот момент, когда ты сможешь вызвать этот метод, у тебя экземпляр класса уже создан, ты ж из него метод-то вызывать и будешь smile.gif
 К началу страницы 
+ Ответить 
Bo2nik
сообщение 23.04.2008 19:54
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: Никита

Репутация: -  0  +


Цитата(volvo @ 23.04.2008 20:30) *

вообще-то задача конструктора. Не совсем понятно, что именно тебе нужно, потому что на тот момент, когда ты сможешь вызвать этот метод, у тебя экземпляр класса уже создан, ты ж из него метод-то вызывать и будешь smile.gif


Вообщем привожу полностью формулировку задачи.
У нас есть программа для работы со старыми бирками(Tags). Теперь необходимо определить новый класс бирок - XTags, который будет расширять старый класс бирок и содержать новый элемент данных. Оба класса могут быть сохранены в массиве Mas как объекты класса Tags.
В программе для создания объктов используются классы Tags и XTags. makeTags - создание объектов Tags и размещение их в массиве. showTags - выводит на экран информацию, содержащуюся в массивк, а метод checkTags является стредством нахождения номер телефона владельца по кличке животного.

Вот что "накалякал":

#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <conio>

class Tags
{protected:
	char nik[10];
	int tel;
public:
	Tags(char*,int);
	void virtual show();
   char* getnik() // тут надо получить кличку собаки
   {return nik;}
   int getphone() // тут получаем номер телефона владельца
   {return tel;}
};

class XTags:public Tags
{int telr;
public:
	XTags(char*,int,int);
	void show();
   char* getnik(){return nik;}
   int getphone(){return tel;}
};

Tags::Tags(char* nnik,int ntel)
{
	strcpy(nik,nnik);
	tel=ntel;
}

XTags::XTags(char* nnik,int ntel,int ntelr):Tags(nnik,ntel)
{
	telr=ntelr;
}

void Tags::show()
{
	cout<<nik<<" "<<tel<<" ";
}

void XTags::show()
{
	Tags::show();
	cout<<telr;
}

Tags* mas[100];

void main()
{char n[10],s[10]; int t,tr,k,i=0,m;
FILE *f;
	f=fopen("d:\\bb.txt","r");
	while (!feof(f))
	{
		fscanf(f,"%d",&k);
		if (k==1) // проверка новая бирка или нет
		{
			fscanf(f,"%s%d%d",n,&t,&tr);
			*(mas+i)=new XTags(n,t,tr);
		}
		else
		{
			fscanf(f,"%s%d",n,&t);
			*(mas+i)=new Tags(n,t);
		}
		i++;
	}
	m=i;
	for(i=0;i<m;i++)
	{
		(*(mas+i))->show();
		cout<<"\n";
	}
   cout << "Enter nik of dog\n";
   cin >> s;
   for(i=0;i<m;i++)
	{
		if (!strcmp((*(mas+i))->getnik(),s)) 
                        cout << (*(mas+i))->getphone() << "\n";
	}
   getch();
}




Вопрос: я правильно делаю, исходя из условия задачи? если нет, то укажите где ошибки. mega_chok.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 23.04.2008 22:17
Сообщение #4


Гость






Цитата
я правильно делаю, исходя из условия задачи?
Я бы делал немного по-другому... В частности, вместо С-шных функций типа fscanf использовал бы потоки (это гораздо удобнее), определил бы функцию makeTags (не метод, а именно функцию, которая будет читать данные из входного потока, инициализировать и добавлять указатели в vector<Tags*> - это вместо массива), функцию showTags - печатающую вектор, и функцию checkTags, осуществляющую в нем поиск... С учетом использования vector-а последние 2 функции вырождаются каждая в одну строку...

Насколько я вижу, это не очень конфликтует с заданием, разве что
1)
Цитата
Оба класса могут быть сохранены в массиве Mas как объекты класса Tags.
не выполняется, храниться будут (да и у тебя сейчас хранятся) указатели на Tags
2)
Цитата
В программе для создания объктов используются классы Tags и XTags. makeTags - создание объектов Tags и размещение их в массиве. showTags - выводит на экран информацию, содержащуюся в массивк, а метод checkTags является стредством нахождения номер телефона владельца по кличке животного.
выделенное слово немного выбивается из того, что я написал выше...
 К началу страницы 
+ Ответить 
Bo2nik
сообщение 23.04.2008 22:38
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: Никита

Репутация: -  0  +


Цитата

вместо С-шных функций типа fscanf использовал бы потоки (это гораздо удобнее)

Я с С++ знаком не очень, можно поподробнее про потоки.

Цитата

добавлять указатели в vector<Tags*> - это вместо массива

И вот это можно показать на примере.

P.S. Вопросы ламерские, но заранее спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.04.2008 0:44
Сообщение #6


Гость






Ну, что-то такого типа:
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>

using namespace std;

class Tags
{
protected:
    char nick[10];
	int tel;

public:
	virtual ostream& print(ostream &os) const {
	    os << nick << " " << tel;
	    return os;
	}

	Tags(char*,int);

	char* get_nick() { // тут надо получить кличку собаки
	    return nick;
    }
    int get_phone() { // тут получаем номер телефона владельца
        return tel;
    }
};

class XTags: public Tags
{
    int telr;

public:
	virtual ostream& print(ostream &os) const {
	    Tags::print(os) << " " << telr;
	    return os;
	}

	XTags(char*, int, int);
};


ostream& operator << (ostream &os, const Tags* tg) {
    tg -> print(os);
    return os;
}

Tags::Tags(char* nnik, int ntel) {
	strcpy(nick, nnik);
	tel = ntel;
}

XTags::XTags(char* nnik, int ntel, int ntelr): Tags(nnik,ntel) {
	telr = ntelr;
}

void makeTags(vector<Tags*>& vec, ifstream& is) {
    int is_new, phone;
    char nick[50];

    while((is_new = is.get()) != EOF) {
        is >> nick;
        is >> phone;

        if(is_new == '1') {
            int add_phone;
            is >> add_phone;
            vec.push_back(new XTags(nick, phone, add_phone));
        }
        else {
            vec.push_back(new Tags(nick, phone));
        }
        // reading up to "\n"
        int ch;
        while(is && (ch = is.get()) != '\n');
    }
}

void showTags(vector<Tags*>& vec) {
    copy(vec.begin(), vec.end(), ostream_iterator<Tags*>(cout, "\n"));
    /*
    for(vector<Tags*>::iterator it = vec.begin(); it != vec.end(); ++it) {
        cout << *(*it) << endl;
    }
    */
}

void checkTags(vector<Tags*>& vec) {
    char s[20];

    cout << "nick to find: " << endl;
    cin >> s;

    vector<Tags*>::iterator it = vec.begin();
    for(; it != vec.end(); it++) {
        if(!strcmp((*it)->get_nick(), s)) break;
    }
    if(it != vec.end()) {
        cout << "phone number = " << (*it)->get_phone() << endl;
    }
    else {
        cout << "nick was not found" << endl;
    }
}

int main()
{
    vector<Tags*> mas;

    ifstream inFile("g:\\birka.txt", ios::in);
    makeTags(mas, inFile);
    inFile.close();

    showTags(mas);
    checkTags(mas);
    return 0;
}

 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 26.07.2025 1:33
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"