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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2012, 22:43   #11
Митовей
Пользователь
 
Регистрация: 07.04.2012
Сообщений: 30
По умолчанию

Тю блин... Совсем про это забыл.
Митовей вне форума Ответить с цитированием
Старый 08.04.2012, 01:17   #12
Митовей
Пользователь
 
Регистрация: 07.04.2012
Сообщений: 30
По умолчанию

Теперь возникла такая ошибка. Вот в этом месте:

Код:
	friend void spit(place a, transation b);
	friend void spit(transation a, place b);
происходит ошибка error C2061: синтаксическая ошибка: идентификатор
Вроде-бы нужно декларатор в скобки засунуть, пробывал не получается.
Митовей вне форума Ответить с цитированием
Старый 08.04.2012, 01:38   #13
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Митовей Посмотреть сообщение
Теперь возникла такая ошибка. Вот в этом месте:

Код:
	friend void spit(place a, transation b);
	friend void spit(transation a, place b);
происходит ошибка error C2061: синтаксическая ошибка: идентификатор
Вроде-бы нужно декларатор в скобки засунуть, пробывал не получается.
1. В том месте программы, где декларируется (либо определяется) использование класса, строение этого класса должно быть известно.
Таким образом, если класс Б использует в своих целях класс Д, то класс Б должен знать строение класса Д.

2. Класс Б может оперировать не значениями экземпляров класса Д, а указателями на них, либо ссылками. В этом случае,в хэдэре классу Б достаточно будет знать только о предварительно объявленном типе Д. Само же туловище с реализациями можно подключать в спп.
В этом случае крайне важно, что бы класс Б имел явно созданный диструктор. Даже если и пустой. (Хотя можно и не объявлять явный диструктор, работать тоже будет, но можно наступить на грабли)

3. Френды - зло. Иногда необходимое. Но чаще всего (и часто благодаря идиотским примерам из деццких книжек) - просто не нужное.

Заюзав у себя френды, ты прибил гвоздями типы означенные в прототипе к классу. И будешь вынужден таскать их повсюду, вместе с этим классом.

Последний раз редактировалось _Bers; 08.04.2012 в 01:43.
_Bers вне форума Ответить с цитированием
Старый 08.04.2012, 01:51   #14
Митовей
Пользователь
 
Регистрация: 07.04.2012
Сообщений: 30
По умолчанию

Насчет первого - это я знаю. Все было нормально, до тех пор, пока я не разбил программу на несколько файлов (чего я, не зря, так жутко боялся). За совет по поводу френдов спасибо. Думаю откажусь в пользу еще одного класса. Так все же как мне избавиться от проблемы? Создать деструктор?
Митовей вне форума Ответить с цитированием
Старый 08.04.2012, 01:57   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Митовей Посмотреть сообщение
Насчет первого - это я знаю. Все было нормально, до тех пор, пока я не разбил программу на несколько файлов (чего я, не зря, так жутко боялся). За совет по поводу френдов спасибо. Думаю откажусь в пользу еще одного класса. Так все же как мне избавиться от проблемы? Создать деструктор?
Так если б ты знал, ты б подключил требуемые декларации типов перед местом использования и не ловил бы ошибку "не известный тип"
_Bers вне форума Ответить с цитированием
Старый 08.04.2012, 02:04   #16
Митовей
Пользователь
 
Регистрация: 07.04.2012
Сообщений: 30
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Так если б ты знал, ты б подключил требуемые декларации типов перед местом использования и не ловил бы ошибку "не известный тип"
Ну лишь немногое... Тоесть мне необходимо указать через typedef нужный тип? Или нет... Вобщем, извините, но сам не знаю.
Митовей вне форума Ответить с цитированием
Старый 08.04.2012, 11:07   #17
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Митовей Посмотреть сообщение
Ну лишь немногое... Тоесть мне необходимо указать через typedef нужный тип? Или нет... Вобщем, извините, но сам не знаю.
Пример 1:

Код:
//TestB.h

#include "TestD.h" //теперь TestB знает строение класса TestD
class TestB
{
    //класс использует тип данных testD 
    //в этой точке он должен знать строение testD
    void Foo(TestD src); 
                         
};
Пример 2:

Код:
//TestB.h

class TestD; //ВНИМАНИЕ! Предварительное объявление.
                 // Обязательно указываем явные диструкторы!
                
class TestB
{
    ~TestB(); //если не указать, можно поймать утечки памяти,
                  //связанные с "удалением неполных типов"

    //класс использует  ссылки/указатели на  testD 
    //ему достаточно предварительных объявлений. 
    //Инклюды строений TestD нужно будет подключить в TestB.cpp
    void Foo(TestD& src); 
    void Bar(TestD* pSrc);
};

//TestB.cpp

#include "TestB.h"
#include "TestD.h"

//дальше идут реализации методов класса TestB
_Bers вне форума Ответить с цитированием
Старый 08.04.2012, 20:08   #18
Митовей
Пользователь
 
Регистрация: 07.04.2012
Сообщений: 30
По умолчанию

И вот снова возникла проблема. После разбиения программы на файлы отказывается работать перегрузка оператора ввода. Вот выдает такие ошибки:
1>d:\новая папка\курсач10\petri_net.h(12): error C2143: синтаксическая ошибка: отсутствие ";" перед "&"
1>d:\новая папка\курсач10\petri_net.h(12): error C2433: istream: "friend" не разрешается для объявлений данных
1>d:\новая папка\курсач10\petri_net.h(12): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\новая папка\курсач10\petri_net.h(12): error C2061: синтаксическая ошибка: идентификатор "istream"
1>d:\новая папка\курсач10\petri_net.h(12): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\новая папка\курсач10\petri_net.h(12): error C2805: бинарный "operator >>" имеет слишком мало параметров
1>d:\новая папка\курсач10\курсач.cpp(50): error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" (или приемлемое преобразование отсутствует)

Загаловочный файл:
Код:
class petri_net {
	int step, step1, step2, stepi, stepj;
	inti, j;
	int **tab1, **tab2;
public:
	petri_net(inti, int j);	
	void build();
	int get_i() {returni;}
	int get_j() {return j;}
	friend istream &operator>>(istream &stream, petri_net &obj);
};
Спп:
Код:
#include <iostream>
#include "Place.h"
#include "Transation.h"
#include "Petri_Net.h"

using namespace std;

petri_net::petri_net(int i, int j) {
	this->i = i;
	this->j = j;
	tab1 = newint*[this->j];
	for (step=0; step<this->j; step++) tab1[step] = newint[this->i];

	tab2 = newint*[this->i];
	for (step=0; step<this->j; step++) tab2[step] = newint[this->j];
}

istream &operator>>(istream &stream, petri_net &obj) {
	cout<<"Заполните таблицы инцидентности\n";
	cout<<"Первая таблица:\n";
	for (obj.step1 = 0; obj.step1<obj.j; obj.step1++)
		for (obj.step2 = 0; obj.step2<obj.i; obj.step2++) stream >> obj.tab1[obj.step1][obj.step2];
	cout<<"Вторая таблица:\n";
	for (obj.step1 = 0; obj.step1<obj.i; obj.step1++)
		for (obj.step2 = 0; obj.step2<obj.j; obj.step2++) stream >> obj.tab2[obj.step1][obj.step2];
	return stream;
}

void petri_net::build() {
	place a(2.0, 8.0);
	transation b(5.0, 58.0);
	a.print();
	b.print();
	spit(a, b);
}
Митовей вне форума Ответить с цитированием
Старый 08.04.2012, 21:10   #19
Митовей
Пользователь
 
Регистрация: 07.04.2012
Сообщений: 30
По умолчанию

Спасибо, уже нашел на форуме аналогичный случай. С проблемой справился
Митовей вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка и перенос данных в отдельные файлы Axell_ Microsoft Office Excel 4 30.08.2011 14:51
каким плеером мне воспроизвести видео и звук(отдельные файлы)вместе??? саша2121 Общие вопросы .NET 1 05.06.2011 22:25
Сохранение листов из 1 файла в отдельные файлы 2S2A1H Microsoft Office Excel 0 26.05.2011 10:14
Почему нельзя разбивать на отдельные файлы шаблонные функции и классы? lordius Visual C++ 22 08.07.2010 09:49