c++实例化一个对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++实例化一个对象相关的知识,希望对你有一定的参考价值。

我想知道c++实例化一个对象的具体意义。难道是像有些书中说的那样是为了分配内存空间吗。而我想类中的成员函数的代码必须在编译好的程序中就已经存在,而数据成员通过实际分配的内存储存数据是可以理解的,那成员函数呢。实例化有具体意义吗,可以通过定义静态成员函数来实现不去实例化一个对象而使用成员函数,这在我看来有点奇怪。我现在设想可能是编译好的程序确实已经存在那段代码只是没有读入内存需要通过实例化对象来读入。但是我一想这样的实现似乎是不可能的,具体都我三言两语说不清。很多类似的这些疑问常常使我很痛苦,我想要通过翻阅资料却经常是买来一本资料它的内容却需要另外的一些知识作铺垫导致我买了很多书暂时只能是搁置。我很希望结识一些真正的高手,我一个人摸索没有人指路许多时候走了弯路显得有些盲目,浪费了很多的时间。希望高手给与指点,如果一时半会讲不清楚请告诉我应该看那些书。谢谢!!!

实例化就是给,数据成员分配内存,构造对象。对象的成员函数和普通函数的区别就是,成员函数有个指向当前对象的this指针,可以访问对象的成员变量,其依赖于对象。静态函数就更像一个全局函数,没有this指针,可以通过类名直接访问,可以被对象的成员函数访问,静态函数只能访问类的静态成员。这些可访问属性是由编译器来实现的,编译之后就没有对象、成员这些东西了,都是数据和方法。 参考技术A A a;
A * a = new a();
以上两种方式皆可实现类的实例化,有new的区别在于:
1.前者在堆栈中分配内存,后者为动态内存分配,在一般应用中是没有什么区别的,但动态内存分配会使对象的可控性增强。
2.不加new在堆栈中分配内存
3.大程序用new,小程序直接申请
4.只是把对象分配在堆栈内存中
5.new必须delete删除,不用new系统会自动回收内存
参考技术B 可以用new(在堆中):

Computer *a = new Computer(...);
也可以直接创建(在栈中):
Computer a(...);

在现有 C++ QT 项目中实例化 QML 对象

【中文标题】在现有 C++ QT 项目中实例化 QML 对象【英文标题】:Instantiating QML object in existing C++ QT Project 【发布时间】:2016-02-06 21:18:32 【问题描述】:

我们有一个用 C++ 编写的现有 QT 项目,我们想将类似 mapViewer 示例项目的东西添加到我们现有的 UI 中。我们无法弄清楚如何实例化 mapViewer,并调用初始化/显示它的方法。根据在线帮助,我们想出了下面的函数,它返回一个 QQuickWidget,我们可以将它添加到 UI 元素中。我们不断收到一个错误,即创建的组件永远无法准备好,因此该功能不起作用。

QQuickWidget *buildMap(QWidget *parent)

    QQmlEngine *engine = new QQmlEngine;
    QQmlComponent component(engine, "qrc://mapviewer.qml");

    QObject *object = component.create();
    QMetaObject::invokeMethod(object, "initializeMap");

    QQuickWidget *map = new QQuickWidget(engine, parent);
    return map;

对我们来说,使用 mapViewer 组件创建一个对象,然后就忘了它,这对我们来说没有多大意义,但是我们在网上找到的示例具有与此类似的流程。

【问题讨论】:

【参考方案1】:

试试这样的:

QQuickWidget *buildMap(QWidget *parent) 
    QQuickWidget *map = new QQuickWidget(parent);
    map->setSource(QUrl("qrc://mapviewer.qml"));
    map->show();
    return map;

至于initializeMap方法,可以在mapviewer.qmlonCompleted中调用吗?如果你坚持从 C++ 调用它,你仍然可以通过 map->rootObject() 访问对象

此外,在创建组件和对象时,无论是从 C++ 还是 QML,检查状态和输出错误字符串(如果有)总是一个好主意,您不要只是假设它会全部工作,然后想知道为什么会这样没有。

【讨论】:

以上是关于c++实例化一个对象的主要内容,如果未能解决你的问题,请参考以下文章

C++只能实例化1个对象的类

C++多态模板类,模板类型对象的实例化

如何使用 QJSEngine 实例化 c++ 对象

从映射访问对象会导致新对象 C++ 的实例化

C++:使用友元类限制对象实例化

在现有 C++ QT 项目中实例化 QML 对象