Каков синтаксис для доступа к функции-члену производного класса с именем Truck в векторе unique_ptrs, который указывает на различные экземпляры Person? - PullRequest
0 голосов
/ 26 апреля 2019

В конкретном примере, скажем, мне дано

vector<shared_ptr<DClass>> cVector

, а DClass (который является производным от MyClass) имеет следующий интерфейс

class DClass: public MyClass {
  public:
    DClass( string id, string name, int p, int v )
      : MyClass id, name, p ), var1_ ( v ) {}
    int GetDClassVar1() const { return var1_; }
  private:
    int var1_;
};

и MyClass (который наследует DClass от) имеет следующий интерфейс

class MyClass {
  public:
    MyClass( string id, string name, int p )
      : id_( id ), name_( name ), myclassvar1__( p ) {}
    string GetMyClassID() const { return id_; }
    string GetMyClassName() const { return name_; }
    int GetMyClassVar1() const { return myclassvar1__; }
    virtual int GetDClassVar1() const { return 0; }
  protected:
    string id_;
    string name_;
    int myclassvar1_;
};

Как я могу вызвать функцию GetDClassVar1, используя cVector, предполагая, что заполнен cVector?

*** РЕДАКТИРОВАТЬ Я пытаюсь использовать

cVector.at(1).GetDClassVar1.() 

и я получаю ошибку

const value_type’ {aka ‘const class std::shared_ptr<MyClass>’} has no member 
named ‘GetDClassVar1'

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Чтобы получить доступ к элементам указателя, вы должны использовать -> вместо .. Кроме того, это почти то же самое!

int result = cVector[0]->GetDClassVar1();

В качестве альтернативы, вы можете сначала разыменовать его:

int result = (*cVector[0]).GetDClassVar1();

Или связать его со ссылкой, если вы выполняете несколько операций над ним:

auto& element = *cVector[0];
int result = element.GetDClassVar1(); 
0 голосов
/ 26 апреля 2019

Как я могу вызвать функцию GetDClassVar1, используя cVector, предполагая, что cVector заполнен

for (const auto& d : cVector)
    std::cout << d->GetDClassVar1() << "\n";

Обратите внимание, что при вызове функции-члена, не являющейся const -квалифицированной, вам необходимо удалить const до auto&. Для одного элемента:

cVector.front()->getDClassVar1();
cVector.at(42)->getDClassVar1();

Этот синтаксис связан с тем, что std::shared_ptr имеет перегруженную operator -> функцию-член, которая пересылает основной указатель.

Также обратите внимание, что вы хотите, чтобы полиморфные базовые классы имели деструктор virtual, см. здесь .

...