Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55

Объявление класса, создание объекта и вызов функции-члена

08.05.2015, 12:31. Показов 1927. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день!

Вот так я объявляю класс.

C++
1
2
3
4
5
6
7
8
9
10
typedef map<string, double> datablock;
typedef map<string, string> groupvars;
 
class PsfFileReader {
public:
  PsfFileReader(string S1);
  ~PsfFileReader();
    
  void setGroupVars();
}; // PsfFileReader
И вот так затем пытаюсь создать объект и вызвать функцию. В нижеприведенном варианте не компилируется.

C++
1
2
3
4
  string fileName1;
  fileName1=argv[2];
  PsfFileReader PFR=new PsfFileReader(fileName1);
  PFR.setGroupVars();
Но если добавить звездочек, компиляция проходит.

C++
1
2
  PsfFileReader* PFR=new PsfFileReader(fileName1);
  (*PFR).setGroupVars();
Вопрос - правильно ли я делаю? Всегда ли обращение к функциям-членам и полям объекта должно выглядеть так?
C++
1
(*PFR).ххххххх
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.05.2015, 12:31
Ответы с готовыми решениями:

Вызов функции-члена класса по адресу в памяти
Всем хорошего дня :) Допустим, что где-то есть static функция, не принимающая аргументов и ничего не возвращающая. Имея один лишь...

Как такое может быть? (вызов функции-члена без объекта)
собственно вопрос озвучен. #include &lt;iostream&gt; using namespace std; class Test { public: void print() {

Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream
Добрый день. В учебнике попалось на первый взгляд простое задание: #include &lt;iostream&gt; int main() { std::cout &lt;&lt;...

6
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
08.05.2015, 12:34
Лучший ответ Сообщение было отмечено rotciv как решение

Решение

Цитата Сообщение от rotciv Посмотреть сообщение
Но если добавить звездочек, компиляция проходит.
Оператор new возвращает указатель поэтому звездочка необходима.
Цитата Сообщение от rotciv Посмотреть сообщение
Всегда ли обращение к функциям-членам и полям объекта должно выглядеть так?
Не всегда. Можно и так:
C++
1
PFR->ххххххх
1
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
08.05.2015, 12:35
Лучший ответ Сообщение было отмечено rotciv как решение

Решение

или так
C++
1
PsfFileReader PFR(fileName1);
или так
C++
1
2
3
PsfFileReader * PFR = new PsfFileReader(fileName1);
// TO DO
delete PFR
1
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
08.05.2015, 12:47  [ТС]
Цитата Сообщение от egor2116 Посмотреть сообщение
или так
C++
1
PsfFileReader PFR(fileName1);
или так
C++
1
2
3
PsfFileReader * PFR = new PsfFileReader(fileName1);
// TO DO
delete PFR
То есть, в первом случае delete не нужен? Объект автоматически уничтожится при выходе из области?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
08.05.2015, 17:53
Цитата Сообщение от rotciv Посмотреть сообщение
То есть, в первом случае delete не нужен?
Да.
Цитата Сообщение от rotciv Посмотреть сообщение
Объект автоматически уничтожится при выходе из области?
Да.
1
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
13.05.2015, 17:33  [ТС]
Если позволите, в продолжение темы.

В зависимости от опций командной строки, я иду по ветвям программы, организованным с помощью switch.
В разных ветвях мне надо создавать разные объекты, например PsfFileReader PFR(fileName1), упомянутый выше.
Компилятор не дает мне создавать объекты в ветвях. Ругань пропадает, только если я выношу объявление вне switch.
Но это не всегда соответствует логике программы.

Пример ругани:
main.cpp:75: error: jump to case label
main.cpp:54: error: crosses initialization of 'LogFileReader LFR'

Я не верю, что это - ограничение компилятора. Или все-таки да? Может быть, вместо switch мне следует использовать if?

Добавлено через 45 минут
Вот, собственно, код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdlib.h>
#include <unistd.h>  // getopt()
#include <cstring>
#include <iostream>
 
using namespace std;
 
class LogFileReader 
{ 
public:
  LogFileReader(const string S);
  ~LogFileReader();
}; // LogFileReader
 
class PsfFileReader {
public:
  PsfFileReader(string S1);
  ~PsfFileReader();
}; // PsfFileReader
 
int main(int argc, char* argv[]) {
 
  int OptMode;
  string fileName1;
  switch(argc) {
    case 2:
      fileName1=argv[1];
      PsfFileReader PFR(fileName1);
      break;
    case 3:
      fileName1=argv[2];
      LogFileReader LFR(fileName1);
      break;
    default:
      cout<<"Default case\n";
  }
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
13.05.2015, 18:55
Лучший ответ Сообщение было отмечено rotciv как решение

Решение

Добавь область видимости в каждый case:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(int argc, char* argv[]) {
 
  int OptMode;
  string fileName1;
  switch(argc) {
    case 2:
    {
      fileName1=argv[1];
      PsfFileReader PFR(fileName1);
      break;
    }
    case 3:
   {
      fileName1=argv[2];
      LogFileReader LFR(fileName1);
      break;
   } 
   default:
      cout<<"Default case\n";
  }
}
case-метки имеют ту же природу, что и метки goto, поэтому они сами по себе не создают области видимости, отсюда вытекает замеченное тобой ограничение.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.05.2015, 18:55
Помогаю со студенческими работами здесь

Вызов глобальной функции из объекта класса
Здравствуйте! Допустим, к примеру, имеется класс, который может хранить в себе адрес на функцию, а также метод который &quot;запустит&quot;...

Вызов функции с не заданными параметрами из объекта класса
Пишу небольшое API, для себя. Сделал следующие: программист указывает объекту класса, имя пакета и какая должна будет вызваться функция,...

Вызов константной функции для неконстантного объекта класса
Доброго дня! Имея класс с двумя перегруженными на основании константности функциями членами, каким образом лучше и проще вызвать...

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

Объявление объекта класса fstream в качестве статической компоненты другого класса
Доброго времени суток. Есть задание, в котором говорится &quot;...Перепишите программы из упражнений 4 и 6 таким образом, чтобы использовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru