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

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

08.05.2015, 12:31. Показов 1918. Ответов 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
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 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
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
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
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru