通过C ++中的指针将子对象值传递给被调用者类

时间:2018-08-27 11:06:46

标签: c++ qt pointers

原始代码似乎引起很多混乱,因此我删除并添加了其他说明性代码。希望不会造成同样的混乱。

将此视为Main calsssomething like manager class

hpp:

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

cpp:

 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;

cpp:

     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 :(得分:0)

非常简单:

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传递给孩子作为指针,并使孩子计算结果存储在该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

答案 1 :(得分:0)

我认为您想要的是(请注意*表示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()返回值。即使您现在返回一个向量,由于返回值的优化,也应该不会有性能问题。