Каким образом класс может получить доступ к членам другого класса? - PullRequest
2 голосов
/ 21 июля 2010

Ранее я задал вопрос о том, как вызывать функции-члены статического члена, чтобы инициализировать его перед фактическим использованием статического объекта. Затем я понял, что, возможно, неправильно использовал статический элемент, что привело к следующему вопросу:

Для определенного класса, MyClass, сколько способов мы можем разработать наш код, чтобы MyClass мог получить доступ к функциям-членам другого класса, YourClass? [Нотабене Предположим, что общая ситуация, когда MyClass объявлена ​​в MyClass.h и определена в MyClass.cpp, и аналогично для YourClass.]

Я могу думать о некоторых, но, будучи далеко от эксперта, я думаю, вы могли бы назвать несколько других:

Сдерживание: Может иметь несколько «разновидностей», при этом прямое удержание объекта YourClass является одной из опций, в то время как указатель или ссылка на объект является другой опцией:

class MyClass
{
public:
  // Some MyClass members...
private:
  YourClass instance;  // or YourClass* instance / YourClass& instance;
  // Some other MyClass members...
};

a) Конечно, прямое сдерживание удобно, но я могу вспомнить один немедленный недостаток: если YourClass немного дороговато с точки зрения требований к памяти, и у вас есть несколько MyClass экземпляров (как в моем связанном вопросе), содержащее объект напрямую не может быть и речи. Кроме того, отношения has-a не всегда имеют смысл.

b) В этом случае лучше иметь указатель или ссылку на объект. При использовании ссылки возникает проблема, заключающаяся в том, что вы можете в конечном итоге сослаться на объект, который больше не существует, поэтому вы должны убедиться, что объект YourClass существует на время существования объекта MyClass.

c) В случае указателя вышеуказанная проблема все еще существует, но вы можете легче переназначить указатель на новый объект.

Наследование: Можно наследовать от объекта YourClass, так что члены наследуются, например:

class MyClass : public YourClass
{
public:
  // Some MyClass members...
private:
  // Some other MyClass members...
};

a) Это также очень просто настроить для нескольких классов, но может стать громоздким для общего использования. Например, если бы YourClass был генератором случайных чисел, не обязательно было бы иметь смысл говорить, что MyClass is-a генератор случайных чисел. Конечно, можно определить класс-оболочку для генератора случайных чисел, скажем, назвать его Randomizable, и тогда MyClass может наследовать от Randomizable, что имеет смысл.

Лично я хотел бы узнать больше о плюсах и минусах статических членов, глобальных объектов, синглетонов и о том, как они правильно используются. Итак, с точки зрения «мета», какие другие методы или шаблоны будут работать?

PS. Хотя я спрашиваю с точки зрения C ++, я думаю, то же самое можно сказать и о применении ко многим другим объектно-ориентированным языкам, поэтому не беспокойтесь о предоставлении примеров на других языках.

1 Ответ

0 голосов
/ 21 июля 2010

Существуют основы доступа к классу C ++.

  1. Вы можете получить доступ к члену своего прямого класса (общедоступному, защищенному или частному)

    class Foo {
    public:
         int fooMember;
    };
    
    int main() {
         Foo foo;
         foo.fooMember = 1;
    }
    
  2. Вы можете получить доступ к защите и общедоступнымчлены вашего родительского класса в дочернем классе, а затем в зависимости от индикатора наследования в объявлении дочернего класса члены родительского класса передаются в public, next-child или остаются закрытыми

    class Animal { 
    
    
    protected:
         int feet;
         int age;
    public:
        enum color { blue, red, green, pink } color;
    
    
     Animal(int feet) { this->feet = feet; }
     bool getFeet() { return feet; }
     void setAge(int a) { age = a; }
    
    
    };
    
    
    class Elephant: public Animal {
    
    
    public:
    
    
     Elephant(void):Animal(4) { }
     int hasFeet(void) { return (feet > 0); }
    
    
    };
    
    
    // Here you can override stuff too so:
    
    
    class Fish: protected Animal {
    public: 
            int teeth;
            enum Type { freshWater, saltWater } type;
        Fish(void):Animal(0) { }
    };
    
    
    class Mackerel: private Fish {
    
    
    public:
            Mackerel(): Fish() { teeth = 12; } /* compiles */
    };
    
    
    class SubMackerel: public Mackerel { 
    public:         
      SubMackerel() { teeth = 8; } /* does not compile teeth not accessible here */
    } ;
    
    
    int main() {
         Elephant pink;
            Fish fishy;
            Mackerel mack;
            pink.color = Animal::blue;
            // this won't compile since color is protected in Fish
            // fishy.color = green;
            fishy.type = freshWater;
            // mack.type = saltWater; // will fail
    }
    
  3. последний способ - объявить друзей.Друг друга может получить доступ ко всем публичным и закрытым членам класса, к которому он относится.

Ну, это должно быть началом ... Вы можете читать дальшеоб этом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...