227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
1

Можно ли так объявить имена переменных типа структуры

22.10.2015, 11:03. Показов 1624. Ответов 20
Метки нет (Все метки)

Страус пишет что "имя нового типа можно использовать сразу же после его появления, а вовсе не после его полного определения". Для чего так делать мне до конца не ясно), но можно ли так поступать(в смысле правильно ли я понял).

C++
1
2
3
4
5
6
7
8
9
10
11
struct averfract{
    int up;
    char ch;
    int down;
    averfract*f1;
    averfract*f2;
    averfract*summ;
};
int main(){
averfract::f1;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2015, 11:03
Ответы с готовыми решениями:

Можно ли в цикле for объявить две переменных разного типа?
Есть такой цикл for(сhar s='A',int i=0; s<'Z'; s++,i++) {} Builder 6 выдает ошибки : ...

Можно ли объявить переменную типа IOPCServer?
Делаю OPC-клиент по примеру. Есть момент, когда в классе объявляется переменная, в которая по...

Можно ли так объявить массив структур? - C++
Почему я не могу объявить так? Компилятор выдаёт ошибку. #include <iostream> using namespace std;...

Объявить массив переменных p вещественного типа, состоящий из 5 элементов
Объявить массив переменных p вещественного типа, состоящий из 5 элементов. Инициализировать его...

20
Модератор
Эксперт С++
12631 / 10128 / 6098
Регистрация: 18.12.2011
Сообщений: 27,159
22.10.2015, 11:11 2
Цитата Сообщение от anti-k Посмотреть сообщение
int main(){ averfract::f1;
C++
1
2
3
4
int main()
{ 
   averfract t1,t2;
  t2.f1=&t1;
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
22.10.2015, 11:18  [ТС] 3
zss,
Цитата Сообщение от zss Посмотреть сообщение
int main()
{
* *averfract t1,t2;
* t2.f1=&t1;
выходит поле переменной что t2.f1 получит все поля переменной t1???
0
Диссидент
Эксперт C
27197 / 16952 / 3747
Регистрация: 24.12.2010
Сообщений: 38,139
22.10.2015, 11:19 4
anti-k, Написав struct averfact { ... }; ты только объявил тип данных. Но память для него еще не выделена. Такой переменной averfact::f1 - просто не существует. Как не существует переменной int
0
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
22.10.2015, 11:21  [ТС] 5
Байт, но здесь уже все создано!?
C++
1
2
3
4
int main()
{ 
   averfract t1,t2;
  t2.f1=&t1;
0
Диссидент
Эксперт C
27197 / 16952 / 3747
Регистрация: 24.12.2010
Сообщений: 38,139
22.10.2015, 11:24 6
Цитата Сообщение от anti-k Посмотреть сообщение
но здесь уже все создано!?
Да, конечно.
0
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
22.10.2015, 11:43  [ТС] 7
Байт, тогда выходит поле переменной что t2.f1 получит все поля переменной t1???

Добавлено через 16 минут
Байт,zss,
C++
1
2
3
4
5
6
struct averfract{   
    int up;
    char ch;
    int down;
averfract():up(0),ch('/'),down(0){}
};
Правильно ли я написал конструктор?
0
Модератор
Эксперт С++
12631 / 10128 / 6098
Регистрация: 18.12.2011
Сообщений: 27,159
22.10.2015, 11:45 8
Правильно
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
22.10.2015, 11:51  [ТС] 9
zss, А за что отвечают {} или это просто синтаксис конструктора?
0
Модератор
Эксперт С++
12631 / 10128 / 6098
Регистрация: 18.12.2011
Сообщений: 27,159
22.10.2015, 11:57 10
Конструктор - тоже функция, у которой должно быть тело.
Что ж поделать, если оно пустое.
Можете для красоты вставить внутрь пустой оператор
C++
1
2
3
4
averfract():up(0),ch('/'),down(0)
{
  ;
}
0
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
22.10.2015, 12:06  [ТС] 11
zss,
А можно туда впихнуть input c cin>>? Если да, то это просто фантастика!!! И как она(input) будет вызываться? при определении переменной?
0
Модератор
Эксперт С++
12631 / 10128 / 6098
Регистрация: 18.12.2011
Сообщений: 27,159
22.10.2015, 12:31 12
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Она будет вызываться всякий раз при создании объекта.
Но вставлять туда cin - это дурной тон.
Надо перегрузить конструктор с параметрами, которые вводятся в Main и потом передаются конструктору.
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
22.10.2015, 12:45  [ТС] 13
zss, Спасибо Сергей Сергеевич!!! Сейчас попробую реализовать!!

Добавлено через 8 минут
zss, уверен что не правильно
C++
1
2
3
4
5
6
7
struct averfract{   
    int up;
    char ch;
    int down;
averfract():up(0),ch('/'),down(0){}
};
averfract(input()){input(up,down)}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.10.2015, 14:53 14
Цитата Сообщение от anti-k Посмотреть сообщение
Правильно ли я написал конструктор?
Если конструктор по умолчанию производит только лишь инициализацию членов (без каких-либо дополнительных действий), то лучше использовать инициализацию членов в классе и вовсе убрать явный конструктор по умолчанию:
C++
1
2
3
4
5
struct averfract{   
    int up = 0;
    char ch = '/';
    int down = 0;
};
1
Модератор
Эксперт С++
12631 / 10128 / 6098
Регистрация: 18.12.2011
Сообщений: 27,159
22.10.2015, 15:17 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct averfract
{   
   int up;
   char ch;
   int down;
   averfract():up(0),ch('/'),down(0){}
   averfract(int up0,char ch0,int down0):up(up0),ch(ch0),down(down0){}
};
int main()
{
    int x,y;
    char cc;
    (cin>>x>>y>>cc).get();
    averfract(x,cc,y);
}
1
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 842
22.10.2015, 15:23 16
1. Не стоит создавать структуры с методами, для этого существуют классы.
2. Так может будет понятнее, зачем использовать имя типа сразу:

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
38
39
40
41
42
43
44
45
#include <iostream>
 
class Averfract{
public:
  Averfract();
  Averfract(int _up, char _ch, int _down, Averfract *_f1, Averfract *_f2);
 
  int up;
  char ch;
  int down;
  Averfract *f1;
  Averfract *f2;
};
 
Averfract::Averfract()
  : up(0),
    ch('/'),
    down(0),
    f1(NULL),
    f2(NULL)
{ }
 
Averfract::Averfract(int _up, char _ch, int _down, Averfract *_f1, Averfract *_f2)
  : up(_up),
    ch(_ch),
    down(_down),
    f1(_f1),
    f2(_f2)
{ }
 
int main(){
  Averfract *a = new Averfract();
  Averfract *b = new Averfract(2, 'b', 2, NULL, NULL);
 
  int c_up = 3;     // Maybe std::cin >> c_up .......
  int c_down = 4;
  Averfract *c = new Averfract(c_up, 'c', c_down, a, b);
 
  std::cout << c->f1->ch << ", " << c->f2->ch << std::endl;
 
  delete c;
  delete b;
  delete a;
  return 0;
}
0
Эксперт PHP
3102 / 2587 / 1219
Регистрация: 14.05.2014
Сообщений: 7,231
Записей в блоге: 1
22.10.2015, 15:26 17
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
averfract():up(0),ch('/'),down(0){}
averfract(int up0,char ch0,int down0):up(up0),ch(ch0),down(down0){}
C++
1
/*explicit*/ averfract(int up0=0,char ch0='/',int down0=0):up(up0),ch(ch0),down(down0){}
Сразу куча конструкторов в одном. Правда в неумелых руках может привести не к тому результату, который ожидали.
0
Don't worry, be happy
17781 / 10545 / 2035
Регистрация: 27.09.2012
Сообщений: 26,514
Записей в блоге: 1
22.10.2015, 15:28 18
Цитата Сообщение от AlexVRud Посмотреть сообщение
Не стоит создавать структуры с методами, для этого существуют классы.
с чего бы...
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 842
22.10.2015, 16:13 19
Цитата Сообщение от Croessmah Посмотреть сообщение
с чего бы...
Типовой code style, хотя поведение struct и class схоже в C++, к ключевому слову struct, часто добавляется и семантическое значение "пассивный". Во многом это определяется тем, что правила именования структур в Си и правила именования классов в С++ различны, даже рамках одной организации. И тем самым пытаются избежать конфликтов именования и неправильного толкования ожидаемых действий.
0
Don't worry, be happy
17781 / 10545 / 2035
Регистрация: 27.09.2012
Сообщений: 26,514
Записей в блоге: 1
22.10.2015, 16:23 20
Цитата Сообщение от AlexVRud Посмотреть сообщение
Типовой code style
std::pair отличный пример структуры, содержащей функции-члены
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2015, 16:23
Помогаю со студенческими работами здесь

Как можно в классе объявить переменную типа DateTime?
Подскажите, пожалуйста, как можно в классе объявить переменную типа DateTime? Получается: Ошибка...

Сколько значений переменных типа char можно записать в динамической памяти на место одной удаленной переменной типа int
Сколько значений переменных типа char можно записать в динамической памяти на место одной удаленной...

Рассмотреть программу, написать имена глобальных переменных, локальных переменных, формальных параметров
Program P1; var s:string; procedure P(var s:string) ; var i, j : integer; ...

можно ли сделать косвенный переход (jmp или call) типа far по содержимому двух переменных
не знаю можно ли сделать косвенный переход (jmp или call) типа far по содержимому двух переменных...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru