Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 как получить доступ из композиций класса в другие композиции .  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
Вопрос в теме.

Возможно я неверно проектирую класс MAIN, но все же...
предположим есть такая картина :

class X {
int x;

public: 
X(int x1): x(x1){}
int getData() {return x;}
}

class Y {
int y;

public: 
Y(int y1): y(y1){}
int getData() {return y;}
void testY() {......}
}
class MAIN {
X x;
Y y;
public:
MAIN (int xo, int y0): x(x0),y(y0){}
}


а можно ли каким-то образом в методе testY() прощемиться к свойствам X ? скажем вызвать X::getData() ?
Можно конечно наобъялвять статик полей в X и сделать френовым Y для X , но мне это не нравится. можно иначе как-то ?
23 май 21, 16:49    [22325885]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394
andron81
а можно ли каким-то образом в методе testY() прощемиться к свойствам X ?

Какого объекта? Если MAIN - просто сделай его х и у публичными.

PS: Или (что проще и лучше) - передай его туда как параметр.

Сообщение было отредактировано: 23 май 21, 18:23
23 май 21, 18:25    [22325920]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
Dimitry Sibiryakov

PS: Или (что проще и лучше) - передай его туда как параметр.


у меня эта мысль у самого проскочила. но пока не выходит
23 май 21, 18:37    [22325922]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

andron81
пока не выходит

Параметры в С++ пишутся в круглых скобках после имени функции.

Posted via ActualForum NNTP Server 1.5

23 май 21, 18:48    [22325926]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
Dimitry Sibiryakov,


круто , вышло вот так :
(в данном случае композиция x класса MAIN "знает" и может использовать весь фарш композиции y)

#include <iostream>
class Y {
	int y;

public:
	Y(int y1) : y(y1) {}
	int getData() { return y; }

};

class X {
	int x;
	Y& YLINK;
public:
	X(Y& y,int x1) : x(x1),YLINK(y) {}
	int getData() { return x; }
	void testY() { std::cout << YLINK.getData() << std::endl; }
};


class MAIN {
	X x;
	Y y;
public:
	MAIN(int x0, int y0) :  y(y0), x(this->y , x0) {}
	void TEST() { x.testY(); }
};

int main(){ 
	MAIN M(100, 500);
	M.TEST();
	
	return 0; 
}


Сообщение было отредактировано: 23 май 21, 18:45
23 май 21, 18:51    [22325927]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3797
"friend"-метод не модно?
24 май 21, 09:26    [22326045]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

Не учи нуба плохому.

Posted via ActualForum NNTP Server 1.5

24 май 21, 12:37    [22326156]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
Давайте не ругаться.
24 май 21, 14:33    [22326245]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
Alex_Ustinov
"friend"-метод не модно?


Очень даже модно. friend у меня получалось если баловаться со статик полями, но мне так не понравилось и думаю это плохо.
думаю, что ты имел ввиду подругому , я бы посмотрел как .

class X {
    int x;
public: X(int x1) : x(x1) {}
      int getX() { return x; }
};

class Y {
    int y;
public: Y(int y1) : y(y1) {}
      void printYX() {  /* этот метод должен вывести сначала y и каким - 
                        то образом должен прощемиться к комопозиции X текущего объекта MAIN и вывести его поле посредством getX() */  }

};

class MAIN {
    X x;
    Y y;
public:
    MAIN(int x0, int y0) : x(x0), y(y0) {}
    void testMAIN() { y.printYX(); }
};

int main() {
    MAIN M(555, 444);
    M.testMAIN(); //должно вывести: 444 555

}


Сообщение было отредактировано: 26 май 21, 11:26
26 май 21, 11:33    [22327325]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
andron81
Очень даже модно
-1
26 май 21, 14:05    [22327464]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
PetroNotC Sharp
andron81
Очень даже модно
-1


ну хорошо - не модно . я для себя , для общего развития. просто интересно я не имею представления как это делать.

Сообщение было отредактировано: 26 май 21, 14:21
26 май 21, 14:28    [22327483]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
andron81,
для этого здорово помогает паттерны изучать. Без них никак.
https://refactoring.guru/ru/design-patterns/catalog
26 май 21, 14:38    [22327488]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
PetroNotC Sharp
andron81,
для этого здорово помогает паттерны изучать. Без них никак.
https://refactoring.guru/ru/design-patterns/catalog


да какие мне паттерны на этом уровне...

мне интересно как френды расставить . пусть хоть и так делать неправильно.

Сообщение было отредактировано: 26 май 21, 14:36
26 май 21, 14:43    [22327492]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
andron81,
Я не понял твою логику.
Против паттернов невозможно катить бочку так как они с первого класса прогера всегда нужны. В любом ЯП.
"мне интересно хоть и не правильно" )))
Удачи!

Сообщение было отредактировано: 26 май 21, 14:51
26 май 21, 14:59    [22327503]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
PetroNotC Sharp,

патерны надо и круто. но мне сейчас сложно в них упуливаться . или ты хочешь чтобы завяз по уши.
мне же интересно как френдами это сделать.

p.s.
я уже давно сделал храня в композиции ссылку на другую. просто интересно как френдами.

Сообщение было отредактировано: 26 май 21, 15:17
26 май 21, 15:19    [22327515]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 205
andron81
мне интересно как френды расставить . пусть хоть и так делать неправильно.

вроде Dimitry дал совет про передачу объекта x в класс Y, чтобы:
andron81
прощемиться к свойствам X ? скажем вызвать X::getData() ?

это что сложно??
26 май 21, 17:25    [22327585]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 205
PetroNotC Sharp
Против паттернов невозможно катить бочку так как они с первого класса прогера всегда нужны. В любом ЯП.

да ладно прям так всегда
26 май 21, 17:26    [22327586]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
бабушкин зайчик,
кодировщику не нужно.
Ему напишут подробное ТЗ, входные выходные, UML, API с заголовками и блок схему ветвлений кода в них)))
А программисту нужны))
26 май 21, 17:54    [22327602]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3797
andron81
Alex_Ustinov
"friend"-метод не модно?


Очень даже модно. friend у меня получалось если баловаться со статик полями, но мне так не понравилось и думаю это плохо.
думаю, что ты имел ввиду подругому , я бы посмотрел как .

 M.testMAIN(); //должно вывести: 444 555

0
https://wandbox.org/permlink/0lUPAqTYPySW3OGn

Сообщение было отредактировано: 26 май 21, 19:12
26 май 21, 19:20    [22327640]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3797
а, там же реализации нет
26 май 21, 19:23    [22327641]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
Alex_Ustinov,
Это не реализация.
Я этот код тебе сделал и какой должен быть результат описал. , чтобы ты туда френды надолбил, ты же пишешь, что френды можно надобавлять и задача будет решена.

Сообщение было отредактировано: 26 май 21, 19:30
26 май 21, 19:37    [22327648]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3797
andron81,

ааа) я так понял что с friend ты уже сделал и хотел по другому...
26 май 21, 19:43    [22327654]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
Alex_Ustinov,

Я изначально сделал до того как создал всю эту тему тут тупо с френдом + статик поля. Потом сделал при помощи поля ссылки на другую композицию в объекте как тут рекомендовали. Но ты предлагал, спользуя только френдовые поля. Как это сделать??

Сообщение было отредактировано: 26 май 21, 19:49
26 май 21, 19:53    [22327658]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3797
andron81
...используя только френдовые поля...
нет я говорил о френд-методах, а не "полях".
+ вариант с friend-методом, прямой доступ к закрытой переменой из другого класса
#include <iostream>
class X;

class Y
{
    int y;

public:
    Y(int y1): y(y1) {}
    int getY()
    {
        return y;
    }
    void printXY(X &x);
};

class X
{
    int x;
public:
    X(int x1): x(x1) {}
    // этот ПАБЛИК геттер для второго варианта без friend
    int getX()
    {
        return x;
    }
    friend void Y::printXY(X & x); // для прямого доступа к private 'x' без геттера
};

class MAIN
{
    X x;
    Y y;
public:
    MAIN (int x, int y): x(x),y(y) {}
    void testMAIN()
    {
        y.printXY(x);
    }
};
// реализация printXY вынесена за пределы класса
// вариант - прямой доступ к закрытой переменной из другого класса
void Y::printXY(X & x)
    {
        std::cout << "printXY() x,y = " << x.x << ", " << getY();
    }

int main()
{
    MAIN M(555, 444);
    M.testMAIN();
    return 0;
};

---------
+ вариант БЕЗ friend-метода, доступ с помощью ГЕТТЕРА
#include <iostream>
class X;

class Y
{
    int y;

public:
    Y(int y1): y(y1) {}
    int getY()
    {
        return y;
    }
    void printXY(X &x);
};

class X
{
    int x;
public:
    X(int x1): x(x1) {}
    // этот ПАБЛИК геттер для второго варианта без friend
    int getX()
    {
        return x;
    }
//    friend void Y::printXY(X & x); ЗАКОММЕНТИРОВАН дружественный метод

};

class MAIN
{
    X x;
    Y y;
public:
    MAIN (int x, int y): x(x),y(y) {}
    void testMAIN()
    {
        y.printXY(x);
    }
};
// реализация printXY вынесена за пределы класса
// вариант без friend-метода, с помощью паблик Геттера
void Y::printXY(X & x)
    {
        std::cout << "printXY() x,y = " << x.getX() << ", " << getY();
    }

int main()
{
    MAIN M(555, 444);
    M.testMAIN();
    return 0;
};
как говорится, смотря по какой теме контрольная
26 май 21, 21:07    [22327682]     Ответить | Цитировать Сообщить модератору
 Re: как получить доступ из композиций класса в другие композиции .  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1106
Alex_Ustinov,

Спасибо. Понял.
26 май 21, 21:28    [22327690]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / C++ Ответить