Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Корректное считывание данных 
:(
    Опции темы
Mayene
  Дата 8.8.2005, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.8.2005

Репутация: нет
Всего: нет



В документации структуры данных описана функция

virtual bool Struct_Base::GetCellInfo (int cID, int *& pID, cmdreal *& coor, cmdreal *& changes) [pure virtual]

Параметры:
cID [IN], pID [INOUT] - указатель типа int
coor [INOUT], charges [INOUT] - указатель типа cmdreal

Эта функция привызове дает cID, pID, coor, charges. Вопрос: как корректно вызвать эту функцию в программе. (Не сильна в синтаксисе..)

Это сообщение отредактировал(а) Mayene - 8.8.2005, 12:53
PM MAIL   Вверх
LPBOY
Дата 8.8.2005, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Это чисто виртуальная функция, ее можно вызывать только в том случае если у нее есть тело,
и только в производных от Struct_Base классах и только статически.
Вот так Struct_Base::GetCellInfo(/*...*/); (ИМХО)
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
comcon1
Дата 8.8.2005, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Ну вот так:
Код

int a;
int *b;
cmdreal *_a, *_b;
// инициализируешь все
object_name->Struct_Base(a, b, _a, _b);

Главное, нельзя писать так:
Код

...
cmdreal _a, _b;
object_name->Struct_Base(a, b, &_a, &_b);

указатели должны быть переменными, раз передается ссылка на них
Добавлено @ 12:58
Только в производных - согласен. Хотя это, в принципе, не обязательно.
Функция ведь абстрактной не объявлена.
Но почему только статически??

Это сообщение отредактировал(а) comcon1 - 8.8.2005, 14:09


--------------------
PM MAIL   Вверх
LPBOY
Дата 8.8.2005, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



2comcon1 Там написано [pure virtual]. У чисто виртуальных функций может быть тело (а может и не быть), если есть то вызывать можно только через квалификатор Struct_Base:: если не ошибаюсь. Статически - потому что для чисто виртуальных функций виртуальный механизм не работает.
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Mayene
Дата 8.8.2005, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.8.2005

Репутация: нет
Всего: нет



comcon1

Т.е. я этот Object_name тоже должна сначала объявить? Что-то вроде:

Код

struct {
  int a;
  int *b;
  cmdreal *_a;
  cmdreal *_b;
} Something;


Поправьте, пожалуйста, где не права...

P.S. Я на Delphi больше 3 лет работала, в C++ только осваиваюсь... Простите, если что не так...
PM MAIL   Вверх
LPBOY
Дата 8.8.2005, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Mayene,
ты лучше по-подробнее расскажи: что за функция, откуда надо вызывать и зачем, и приведи код где у тебя выдается ошибка...
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
comcon1
Дата 8.8.2005, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



2 LPBOY. Спасибо буду знать.
2 автор. Да, ты дала слишком мало инфо.


--------------------
PM MAIL   Вверх
Mayene
Дата 8.8.2005, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.8.2005

Репутация: нет
Всего: нет



LPBOY

У меня физико-математический проект. В настоящий момент все, что наработано, нужно запрограммировать. К моему сожалению... на С++.

У проекта уже есть готовое описание структуры данных. Т.е. мне нужно плавно влиться в то, что есть. А именно....

К описанию выше обозначенной функции

Код

virtual bool Struct_Base::GetCellInfo (int cID, int *& pID, cmdreal *& coor, cmdreal *& changes) [pure virtual]


приделано следующее описание:

Вызывая эту функцию, ID, координаты и заряды всех частиц внутри клетки (молекулярная динамика) возвращаются. В параллельном варианте это работает только для клеток, которые существуют на данном процессе. (Параллельное мне пока не нужно smile ) Вызывая эту функцию, необходимо обеспечить память для хранения соответствующих параметров.

Ну коротко и все. Теперь мне эту функцию нужно корректно вызвать. Т.е. вызвать таким образом, чтобы у меня сформировался массив данных, каждый элемент массива - т.н. клетка с номером, координатами и зарядами...
PM MAIL   Вверх
Дрон
Дата 8.8.2005, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(LPBOY @ 8.8.2005, 14:13)
У чисто виртуальных функций может быть тело (а может и не быть), если есть то вызывать можно только через квалификатор Struct_Base:: если не ошибаюсь. Статически - потому что для чисто виртуальных функций виртуальный механизм не работает.

А особенно вот это: для чисто виртуальных функций виртуальный механизм не работает -- БРЕД.
Извини, но это, действительно, редкостный бред.


Mayene
Цитата(Mayene @ 8.8.2005, 14:13)
Т.е. я этот Object_name тоже должна сначала объявить?

object_name в том примере должен быть указателем на Struct_Base (или на производный он класс).


--------------------
Да. Именно так.
PM   Вверх
Mayene
Дата 8.8.2005, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.8.2005

Репутация: нет
Всего: нет



Файл, в котором лежит эта функция, выглядит так:

Код

#ifndef _STRUCT_BASE_H_
#define _STRUCT_BASE_H_
#include "../../ForceModul/include/typedefs.h"

class Struct_Base
{
   public:
      Struct_Base(){};

      virtual ~Struct_Base(){};

      virtual bool GetcellInfo(int cID,int*& pID,cmdreal*& coor,
                               cmdreal*& charges) = 0;

      virtual bool PutForceL(int cID, cmdreal* force) = 0;
};
#endif // endif _STRUCT_BASE_H_


PM MAIL   Вверх
Дрон
Дата 8.8.2005, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(Mayene @ 8.8.2005, 14:38)
Теперь мне эту функцию нужно корректно вызвать

Итак.

Чтобы её вызвать тебе во-первых нужен объект класса, производного от Struct_Base. В примере comcon1 на этот объект указывает указатель object_name, который должен быть объявлен примерно так: Struct_Base *object_name;

Теперь пишем так (как и сказал comcon1):
Код

int cID; // ему нужно ещё присвоить какое-то значение
int *pID;
cmdreal *coor, *changes;
object_name->GetCellInfo( cID, pID, coor, changes );


Вместо object_name будет тот указатель на объект, который у тебя есть.
Добавлено @ 13:47
Mayene
Цитата(Mayene @ 8.8.2005, 14:42)
Файл, в котором лежит эта функция, выглядит так:

Реально там нет этой функции.
Ведь там написано = 0, а это значит, что GetCellInfo -- это чисто виртуальная функция, которая должна быть переопределена в производных классах.

Это сообщение отредактировал(а) Дрон - 8.8.2005, 13:50


--------------------
Да. Именно так.
PM   Вверх
Mayene
Дата 8.8.2005, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.8.2005

Репутация: нет
Всего: нет



Дрон
Спасибо огромное за доходчивое объяснение! Очень признательна! smile
PM MAIL   Вверх
LPBOY
Дата 8.8.2005, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Ты уверена что у этой функции есть тело?? Если "да", тогда:
Очень важный момент: откуда ты ее хочешь вызвать??? Если из main то не получиться,
по крайней мере напрямую, а если из функции-члена производного класса, то
через квалификатор :: базового.

А может это чисто вирт. функция без тела? Тогда тебе надо ее вызывать
через объекты производных классов. Короче нужна еще информация...
Сейчас я еще напишу несколько примерчиков, подожди...

2Дрон, ты не прав, тебе отвечу позже...
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
comcon1
Дата 8.8.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



2 дрон. быстро исправил! тока хотел написать про ошибку. smile



--------------------
PM MAIL   Вверх
Дрон
Дата 8.8.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(comcon1 @ 8.8.2005, 14:54)
2 дрон. быстро исправил! тока хотел написать про ошибку. smile

Да, я не заметил сначала, что 2-й параметр тоже по ссылке передаётся smile
Добавлено @ 13:58
LPBOY
Чисто виртуальная функция для того и придумана, чтобы определить некий интерфейс к объекту.

Если у нас есть
Код

#include <iostream>

class CBase
{
public:
    virtual void Test() = 0;
};

class CDerived: public CBase
{
public:
    void Test()
    {
          std::cout << "!!!!";
    }
};

void main()
{
    CBase *p1, *p2;
    p1 = new CBase; // выдаст ошибку: нельзя создать объект абстрактного класса
    p2 = new CDerived; // всё нормально

    p2->Test(); // и хотя p2 иммет тип CBase, но будет вызвана функция из CDerived

    delete p1;
    delete p2;
}



--------------------
Да. Именно так.
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0664 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.