方法c ++中的构造函数

时间:2016-11-08 04:02:44

标签: c++ visual-studio

我在一个方法中有一个构造函数,我想要随时访问

//ItemEditor.cpp
#include "ItemContainer.h"       
 void ItemEditor::CreateItem() {

            ItemContainer* wornItems = new ItemContainer();
    }

在我的驱动程序内部,我调用我的方法createItem();

//driver
int main(){
    ItemEditor* createItem = new ItemEditor();
        createItem->CreateItem();
}

之后我想访问createItem之外的背包

我该如何实现?

2 个答案:

答案 0 :(得分:0)

使item容器成为成员变量,因此其范围是对象的生命周期。

没有理由使用动态分配,所以只需使用ItemContainer的实例而不是指针。

#include <iostream>

class ItemContainer {
    int item = 0;
    public:
        void addItem(int i) {
            item = i;
        }
        int getItem() {
            return item;
        }


}; 

class ItemEditor {

    public:
        ItemEditor() {

        }
        void createEditor() {
             wornItems.addItem(3);   
        }
        ItemContainer wornItems;


};


int main() {

    ItemEditor editor;
    int item = editor.wornItems.getItem(); //or some method
    std::cout << item << std::endl;
    editor.createEditor();
     item = editor.wornItems.getItem(); //or some method
    std::cout << item;

    return 0;

}

您还可以将容器设为私有,并使用公共方法访问其内容。您可以看到示例here

答案 1 :(得分:0)

通过背包我假设

返回的内容
 createItem->CreateItem();

为什么不将它存储在指针中,因为你使用new来在堆中分配对象?

ItemContainer* ItemEditor::CreateItem() {

        return new ItemContainer();
}

主档案:

int main(){
    ItemEditor* createItem = new ItemEditor();
    ItemContainer* backpack = createItem->CreateItem();
}

此外,我想建议为ItemContainer提供移动语义并摆脱指针是一种更好的做法。这样你依靠RAII和堆栈来破坏对象,减少内存泄漏的风险。相关文章: http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html

这是一个完整的编译代码:

//Header.h

#include <iostream>

class ItemContainer{
public:
    void sayHello(){
        std::cout << "HulloWorld!\n";
    }
};

class ItemEditor{
public:
    ItemEditor(){};
    ItemContainer* ItemEditor::CreateItem(){
        return new ItemContainer();
    }
};

MainFile:

//main
#include "Header.h"

int main()
{
    ItemEditor* createItem = new ItemEditor();
    ItemContainer* backpack = createItem->CreateItem();
    backpack->sayHello();
}