Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
31.07.2013, 23:45     Как избежать такую конструкцию? #1
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;
}
Есть ли другие способы доступа?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
31.07.2013, 23:49     Как избежать такую конструкцию? #2
C++
1
std::cout << (*foo[3])[2];
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2013, 23:51     Как избежать такую конструкцию? #3
это вроде как бросить пить, или кто насильно вливает?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.08.2013, 00:37     Как избежать такую конструкцию? #4
Для этого достаточно не использовать перегруженные операторы там, где они выглядят нелогично.

Не по теме:

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

alsav22
5282 / 4801 / 442
Регистрация: 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;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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;
}
Можете не благодарить
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 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 ] ;
   }
}
alsav22
01.08.2013, 06:19
  #8

Не по теме:

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

Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.08.2013, 10:49     Как избежать такую конструкцию? #9
Цитата Сообщение от alsav22 Посмотреть сообщение
цитату как понимать? Теряюсь в догадках...

Не по теме:

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

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

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

Не по теме:

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

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

Не по теме:

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


Какая, нафиг, оптимизация? Я взял то, что было у автора, и убрал приват и оператор всего лишь!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2013, 11:48     Как избежать такую конструкцию?
Еще ссылки по теме:

C++ как избежать зацикливания
Можно ли использовать такую конструкцию? C++
C++ Как избежать использование глобальных объектов

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

Или воспользуйтесь поиском по форуму:
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
01.08.2013, 11:48  [ТС]     Как избежать такую конструкцию? #15
Kuzia domovenok, я просто навел корявый пример.
Yandex
Объявления
01.08.2013, 11:48     Как избежать такую конструкцию?
Ответ Создать тему
Опции темы

Текущее время: 01:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru