Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
rotciv
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
#1

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

08.05.2015, 12:31. Просмотров 996. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2015, 12:31
Ответы с готовыми решениями:

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

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

Перегруженный оператор сдвига '<<' не функции-члена класса для объекта ostream
Добрый день. В учебнике попалось на первый взгляд простое задание: #include...

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

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

6
Ilot
Эксперт С++
1831 / 1189 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
08.05.2015, 12:34 #2
Лучший ответ Сообщение было отмечено rotciv как решение

Решение

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

Решение

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

В зависимости от опций командной строки, я иду по ветвям программы, организованным с помощью 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
DrOffset
8007 / 4646 / 1129
Регистрация: 30.01.2014
Сообщений: 7,551
13.05.2015, 18:55 #7
Лучший ответ Сообщение было отмечено 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
13.05.2015, 18:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2015, 18:55

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru