передача значения дочернего объекта классу вызываемого через указатель в C ++ - PullRequest
0 голосов
/ 27 августа 2018

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

Рассмотрим это как Main calss (something like manager class)

HPP:

 private: std::vector<int>* _cache;

касты

 whatever* whatever::somefunction(const String& nothing)
    {
        const auto newWhatever = new whatever{nothing, _cache};
        return newWhatever; // not important
    }

Other Class (класс, который выполняет некоторую работу и возвращает результат)

HPP:

private: std::Vector<int> _cache;

касты:

     class OtherClass
{
    std::vector* _value;
    std::vector _result;
public:
    OtherClass(const string& nothing, std::vector<int>* cache) : _value{cache}

    void calculateresult()
    {
      *_value = _result;
      }
}

returning value from the method is impossible as per the original setup

Я бы хотел зафиксировать результат, полученный в OtherClass, в указатель Main class.

Цель: OtherClass является временным, он будет уничтожен и воссоздан каждые 10 секунд один раз. Поэтому мне нужно сохранить результат этого OtherClass и использовать его для следующего его создания. Как вы можете видеть, создание этого OtherClass произойдет из Main class, это как менеджер.

Когда я отлаживаю, я вижу, что для _value назначен адрес, и разыменование может не работать, я не знаю.

Но это не удается во время назначения i, e *_value = _result;

слева - T = QVector * и справа - QVector.

Исключение в коде: qvector.h

template <typename T>
QVector<T> &QVector<T>::operator=(const QVector<T> &v)
{
    if (v.d != d) {
        QVector<T> tmp(v);
        tmp.swap(*this);
    }
    return *this;
}

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Я думаю, что вы хотите (обратите внимание на * для Localvalue):

class Child
{
    public:
        Child (int* value) : Localvalue{value};
        int* Localvalue;
        int Resultvalue;
        void doSomething() {
            if (Localvalue != nullptr) 
                *Localvalue = Resulvalue; 
        }
};

Как говорится, это довольно плохая установка. Дочерний элемент требует, чтобы владелец гарантировал, что переданный указатель останется действительным в течение срока действия экземпляра Child.

Вы можете улучшить его, используя shared_ptr<int>. Или, следуя другим предложениям по вашему вопросу, верните значение из doSomething(). Даже если теперь вы возвращаете вектор, благодаря оптимизации возвращаемого значения не должно быть проблем с производительностью.

0 голосов
/ 27 августа 2018

Очень просто:

class Child
{
    int m_Data = 0;

public:
    Child(int Data) : m_Data(Data) {};

    int doSomething()
    {
        // Do something ("Child calculation") , for example:
        int a = 0, b = 0, c = 0, d = 0, e = 0, f = m_Data, r = 0;
        r = a * b * c * d * e * f + a * b * c + f + 5;

        return r;
    }
};

Использование:

Child Chl(5);

int Result = Chl.doSomething(); // Result is 10

-

Если вы предпочитаете работать с указателем: ... Вы написали: «передайте значение от Parent дочернему элементу в качестве указателя и сделайте результат вычисления дочернего элемента для сохранения в месте, указанном указателем этого родительского значения». :

class Child
{
    int * m_pData = nullptr;

public:
    Child(int * pData) : m_pData(pData) {};

    void doSomething()
    {
        // Do something ("Child calculation") , for example:
        int a = 0, b = 0, c = 0, d = 0, e = 0, f = *m_Data, r = 0;
        r = a * b * c * d * e * f + a * b * c + f + 5; 

        *m_pData = r; // "store in the location pointed"
    }
};

Использование:

int Data = 5; // "A value from Parent"

Child Chl(&Data); // "To the Child, as a pointer"

Chl.doSomething(); // Data is 10

-

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