Неверный размер вектора - как мы можем инициализировать вектор внутри структуры - PullRequest
0 голосов
/ 12 ноября 2018

Ниже приведен пример кода:

#include <iostream>
#include <vector>

typedef struct defs
{
    std::vector<int> myvec;
} dvec;

typedef struct devdef: public dvec
{
    dvec dvec1;
    devdef()
    {
          dvec1.myvec.push_back(10);
    }
}myVec;

class A
{
public:
    A():v1()
    {
         std::cout << "my vec size is " << v1.myvec.size() << std::endl;
    }
private:
    myVec v1;
};

int main()
{
     A a1;
}

Скомпилируйте и выполните:

$ c++ -std=c++11 try58.cpp

$ ./a.exe
my vec size is 0

Я ожидал, что размер вектора будет равен 1 - почему то же самое равно 0?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Эта версия, я думаю, делает то, что вы хотели.

#include <iostream>
#include <vector>

struct dvec
{
    std::vector<int> myvec;
}

struct myVec : public dvec
{
    myVec()
    {
          myvec.push_back(10);
    }
}

class A
{
public:
    A():v1()
    {
         std::cout << "my vec size is " << v1.myvec.size() << std::endl;
    }
private:
    myVec v1;
};

int main()
{
     A a1;
}

Некоторые заметки о том, что я изменил.

  1. Нет необходимости использовать typedef для создания нового типа. В C ++ class и struct определяют новые типы.
  2. При получении нового типа myVec из dvec он содержит векторное имя myvec, поэтому нет необходимости добавлять новый.
  3. В конструкторе для производного типа myVec мы можем напрямую получить доступ к члену myvec базового типа, поскольку он является членом этого объекта.
0 голосов
/ 12 ноября 2018

У вас есть dvecs как родительский элемент myVec, а также член myVec.В вашем конструкторе вы увеличиваете значение до dvec1.myvec, но в A вы читаете v1.myvec aka член родительского элемента.У вас просто есть два экземпляра dvecs в вашей структуре, и вы используете разные в своих функциях.

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