相关疑难解决方法(0)

QVector对默认构造函数的要求是什么原因?

我可以看到这些类被视为调用默认构造函数所需的复杂对象:

void QVector<T>::defaultConstruct(T *from, T *to)
{
    if (QTypeInfo<T>::isComplex) {
        while (from != to) {
            new (from++) T();
        }
    ...
}
Run Code Online (Sandbox Code Playgroud)

但目前尚不清楚为什么需要在QVector的"隐藏"区域构建对象.我的意思是这些对象根本不可访问,那么为什么不保留内存而不是真正的对象创建呢?

作为奖励的问题,我想问一下,如果我想有非默认constractible对象的数组,可我安全地更换QVector<T>QVector<Wrapper<T>?在哪里Wrapper是这样的:

class Wrapper {
public:
    union {
        T object;
        bool hack;
    };
    Wrapper() {}
    Wrapper(const T &t) : object { t }  {}
    Wrapper(const Wrapper &t) : object { t.object } {}

    Wrapper &operator=(const Wrapper &value) {
        object = value.object;
        return *this;
    }

    ~Wrapper() {}
};
Run Code Online (Sandbox Code Playgroud)

c++ qt containers qvector

7
推荐指数
1
解决办法
1069
查看次数

使用QVector时,没有匹配的默认构造函数调用

我有一个B类,它创建一个A类的对象并调用该对象的方法.

#ifndef A_H
#define A_H

class A
{
public:
    A(int);
    void function();
};

#endif // A_H
Run Code Online (Sandbox Code Playgroud)

a.cpp

#include "a.h"

A::A(int x)
{

}
void A::function(){
    //Do something.
}
Run Code Online (Sandbox Code Playgroud)

BH

#ifndef B_H
#define B_H
#include <QVector>
#include <a.h>


class B
{
public:
    B(int);
    QVector<A> list;
};

#endif // B_H
Run Code Online (Sandbox Code Playgroud)

b.cpp

#include "b.h"

B::B(int y)
{
    list.append(A(y));
    list[0].function();
}  
Run Code Online (Sandbox Code Playgroud)

问题是这不能编译.它返回"没有匹配的函数来调用'A:A()'".我知道这可以通过前向声明来解决,但这在这里不起作用,因为我想调用函数"function".我也不想把全班A都包括在B班.

c++ qt qvector

3
推荐指数
1
解决办法
205
查看次数

标签 统计

c++ ×2

qt ×2

qvector ×2

containers ×1