Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
1

Как избежать такую конструкцию?

31.07.2013, 23:45. Просмотров 573. Ответов 14
Метки нет (Все метки)

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
#include <iostream>
#include <vector>
 
class Foo
{
    public:     
        Foo() {
            x = 0;
        }
        
        int operator[]( int a ) {
            return x;
        }
    
    private:
        int x;
};
 
int main() {
    std::vector< Foo* > foo( 20 );
    
    for( int i = 0; i < 20; i++ ) {
        foo[i] = new Foo;
    }
    
    //как избежать такую уродливую конструкцию?
    std::cout << foo[3]->operator[]( 2 );
    
    return 0;
}
Есть ли другие способы доступа?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2013, 23:45
Ответы с готовыми решениями:

Можно ли использовать такую конструкцию?
Здраствуйте! Нужно ввести несколько работником тоесть их ФИО и зарплату. Можно...

Как по-русски обозвать целиком эту конструкцию?
Ту что в круглых скобках в операторе for? for (i=0; i&lt;n; ++i) { cout&lt;&lt;i; }...

Помогите создать конструкцию как экспортируемую функцию shared DLL
Я пишу на VB, но по некоторым причинам в VB невозможно реализовать необходимую...

как избежать зацикливания
Подскажите пожалуйста, как избежать зацикливания программы про вводе буквы вот...

Как избежать ошибок линковщика?
Я только-только начал изучать С++(Borland). Взял первый попавшийся пример из...

14
Fyret
200 / 186 / 45
Регистрация: 30.07.2013
Сообщений: 392
31.07.2013, 23:49 2
C++
1
std::cout << (*foo[3])[2];
0
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2013, 23:51 3
это вроде как бросить пить, или кто насильно вливает?
0
OhMyGodSoLong
~ Эврика! ~
1246 / 995 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
01.08.2013, 00:37 4
Для этого достаточно не использовать перегруженные операторы там, где они выглядят нелогично.

Не по теме:

Глагол "избегать" не переходной (подобно большинству глаголов, выражающих перемещения в пространстве) и используется с существительными в родительном падеже: избежать смерти, ситуации, неприятностей, конструкции.

2
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.08.2013, 03:25 5
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
#include <iostream>
#include <vector>
 
class Foo
{
    public:     
        Foo() 
        {
            x = 0;
        }
        int get()
        {
            return x;
        }
 
        void set(int y)
        {
            x = y;
        }
    
    private:
        int x;
};
 
int main() 
{
    std::vector< Foo* > foo(20);
    
    for( int i = 0; i < 20; i++ ) 
    {
        foo[i] = new Foo;
        foo[i] ->set(i);
    }
    
    std::cout << foo[3] ->get() << std::endl;
 
    for( int i = 0; i < 20; i++ ) 
        delete foo[i];
        
    return 0;
}
1
Kuzia domovenok
2357 / 2091 / 494
Регистрация: 25.03.2012
Сообщений: 7,487
Записей в блоге: 1
01.08.2013, 04:18 6
Цитата Сообщение от alsav22 Посмотреть сообщение
#include <iostream>
#include <vector>
class Foo
{
public:
Foo(){
x = 0;
}
int get(){
return x;
}
void set(int y){
x = y;
}
private:
int x;
};
int main()
{
std::vector< Foo* > foo(20);
for( int i = 0; i < 20; i++ ) {
foo[i] = new Foo;
foo[i] ->set(i);
}
std::cout << foo[3] ->get() << std::endl;
for( int i = 0; i < 20; i++ )
delete foo[i];
return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
class Foo{
    public:
            Foo(){
              x = 0;
           }
           int x;
};
int main() {
  std::vector< Foo* > foo(20);
  for( int i = 0; i < 20; i++ ) {
    foo[i] = new Foo;
    foo[i] ->x=i;
  }
  std::cout << (foo[i] ->x) << std::endl;
  for( int i = 0; i < 20; i++ ) 
    delete foo[i];
  return 0;
}
Можете не благодарить
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,585
Записей в блоге: 2
Завершенные тесты: 1
01.08.2013, 04:32 7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
C++
1
std::cout << (foo[i] ->x) << std::endl;
Тут i нету

Добавлено через 2 минуты
Вот еще извращение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <vector>
 
struct Foo {
   Foo ( int x_ ) : x ( x_ ) { 
   }
   int x = 0 ;
} ;
 
int main ( ) {
   std::vector < Foo * > foo(20);
   for( int i = 0 ; i < foo.size ( ) ; i++ ) {    
      std::cout << ( foo[ i ] = new Foo ( i ) ) -> x << std::endl ;
      delete foo [ i ] ;
   }
}
1
alsav22
01.08.2013, 06:19
  #8

Не по теме:

Kuzia domovenok, цитату как понимать? Теряюсь в догадках...

0
Kuzia domovenok
2357 / 2091 / 494
Регистрация: 25.03.2012
Сообщений: 7,487
Записей в блоге: 1
01.08.2013, 10:49 9
Цитата Сообщение от alsav22 Посмотреть сообщение
цитату как понимать? Теряюсь в догадках...

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Тут i нету

Вот еще извращение

ну да, я и хотел просто сказать, что всё стоит делать public
0
Jupiter
01.08.2013, 11:04
  #10

Не по теме:

Kuzia domovenok, у вас же значение мемберу x присваивается два раза...как же так...это ж...на одну инструкцию больше...

1
Kuzia domovenok
2357 / 2091 / 494
Регистрация: 25.03.2012
Сообщений: 7,487
Записей в блоге: 1
01.08.2013, 11:19 11
Цитата Сообщение от Jupiter Посмотреть сообщение
Kuzia domovenok, у вас же значение мемберу x присваивается два раза...как же так...это ж...на одну инструкцию больше...
1) Где у меня?
2) Почему именно у меня?
3) При чём тут вообще я?
0
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
01.08.2013, 11:19  [ТС] 12
Не хотелось через set/get работать но наверно придется. Еще можно воспользоватся кодом из первого поста. но я себе представляю. как ето будт виглядит запутанно.
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.08.2013, 11:27 13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
1) Где у меня?
2) Почему именно у меня?
3) При чём тут вообще я?
В чем суть вашей оптимизации? Убрали сеттер который с вероятностью 0.99 был бы заинлайнен. А конструктор оставили
0
Kuzia domovenok
2357 / 2091 / 494
Регистрация: 25.03.2012
Сообщений: 7,487
Записей в блоге: 1
01.08.2013, 11:33 14
Цитата Сообщение от Jupiter Посмотреть сообщение
Убрали сеттер который с вероятностью 0.99 был бы заинлайнен.
А ты тему читай: автору не оптимизация была нужна, а упростить доступ к полю объекта

Не по теме:

кстати, зачем он вообще использует оператор [], если индекс ни на что не влияет


Какая, нафиг, оптимизация? Я взял то, что было у автора, и убрал приват и оператор всего лишь!
0
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
01.08.2013, 11:48  [ТС] 15
Kuzia domovenok, я просто навел корявый пример.
0
01.08.2013, 11:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2013, 11:48

Бесконечный цикл (как избежать?)
Программа должна принимать только одно из трёх значений переменной 'destiny'....

Как избежать использования кучи проверок?
В общем есть файл конфига, в котором хранятся переменные, так вот, я хотел бы...

Как избежать округления дробных чисел
не виводит дробь а только целие числа. где проблема ? #include &lt;iostream.h&gt;...


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

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

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